/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ // LoginDlg.cpp : implementation file // #include "stdafx.h" #include "LoginDg.h" #include "prefapi.h" #include "hk_funcs.h" #include "setupwiz.h" #include "mucwiz.h" #include "mucproc.h" #include "profile.h" #include "dialog.h" #include "helper.h" #ifdef MOZ_LOC_INDEP #include "winli.h" #endif /* MOZ_LOC_INDEP */ #ifdef NEW_PREF_ARCH #include "cprofile.h" #include "clocal.h" #endif #ifdef XP_WIN16 #include "winfile.h" #endif #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif int login_SetUserKeyData(const char *profileName); ///////////////////////////////////////////////////////////////////// // CLoginList class CLoginList: public CListBox { private: int m_iPosIndex, m_iPosName, m_iPosStatus; protected: virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ); afx_msg void OnLButtonDown( UINT nFlags, CPoint point ); afx_msg void OnLButtonDblClk( UINT nFlags, CPoint point ); virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct ); DECLARE_MESSAGE_MAP() public: CLoginList(); ~CLoginList(); void SetColumnPositions(int, int, int); }; ///////////////////////////////////////////////////////////////////////////// // CLoginDlg dialog class CLoginDlg : public CDialog { // Construction public: CLoginDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CLoginDlg) enum { IDD = IDD_LOGIN_DIALOG }; CLoginList m_LoginList; CString m_ProfileSelected; CStringList m_Profiles; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CLoginDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CLoginDlg) virtual void OnOK(); virtual BOOL OnInitDialog(); afx_msg void OnDblclkLoginList(); afx_msg void OnSelChangeLoginList(); afx_msg void OnNewProfile(); afx_msg void OnDeleteProfile(); afx_msg void OnOption(); afx_msg void OnAdvance(); afx_msg void OnCheck(); afx_msg void OnEdit(); afx_msg void OnRemote(); //}}AFX_MSG DECLARE_MESSAGE_MAP() void CheckPEConfig(); void DialogDisplay(BOOL); private: // PE RECT rect; int m_range; BOOL m_bRestoreWindow; BOOL m_bDialOnDemand; CString m_strAcctName; CString m_strModemName; CString m_strProfileName; }; #define PREF_CHAR 0 #define PREF_INT 1 #define PREF_BOOL 2 struct update_PrefTable { char *xp_name; char *section; char *name; int type;}; ///////////////////////////////////////////////////////////////////////////// // CUpdateFileDlg dialog // class CUpdateFileDlg : public CDialog { // Construction public: CUpdateFileDlg(CWnd *pParent, BOOL bCopyDontMove); // Called at the start of each image saved void StartFileUpdate(char *category,char * pFilename); BOOL m_bCopyDontMove; // Dialog Data //{{AFX_DATA(CSaveFileDlg) enum { IDD = IDD_UPDATE_STATUS }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA private: CWnd *m_pParent; // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSaveFileDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support virtual void PostNcDestroy(); //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CSaveFileDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// // CLoginDlg dialog CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/) : CDialog(CLoginDlg::IDD, pParent) { //{{AFX_DATA_INIT(CLoginDlg) m_ProfileSelected = _T(""); //}}AFX_DATA_INIT if(theApp.m_bPEEnabled) { m_bRestoreWindow = FALSE; m_bDialOnDemand = TRUE; m_strAcctName = ""; m_strModemName = ""; } } void CLoginDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CLoginDlg) //DDX_Control(pDX, IDC_LOGIN_LIST, m_LoginList); DDX_LBString(pDX, IDC_LOGIN_LIST, m_ProfileSelected); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CLoginDlg, CDialog) //{{AFX_MSG_MAP(CLoginDlg) ON_LBN_DBLCLK(IDC_LOGIN_LIST, OnDblclkLoginList) ON_LBN_SELCHANGE(IDC_LOGIN_LIST, OnSelChangeLoginList) ON_COMMAND(IDC_CREATENEWPROFILE, OnNewProfile) ON_COMMAND(IDC_DELETEPROFILE,OnDeleteProfile) ON_COMMAND(IDC_OPTION,OnOption) ON_COMMAND(IDC_ADVANCED,OnAdvance) ON_COMMAND(IDC_PROFILE1,OnRemote) ON_COMMAND(IDC_CHECK,OnCheck) ON_COMMAND(IDC_EDITPROFILE,OnEdit) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CLoginDlg message handlers void CLoginDlg::OnEdit() { UpdateData(); char szMsg[_MAX_PATH+128]; sprintf(szMsg,szLoadString(IDS_PROFILE_RENAME), m_ProfileSelected); CDialogPRMT dlgPrompt(this); char * newName = dlgPrompt.DoModal(szLoadString(IDS_PROFILE_RENAME2), m_ProfileSelected,szMsg); if (newName) { login_RenameUserKey(m_ProfileSelected,newName); m_LoginList.DeleteString(m_LoginList.FindStringExact(-1,m_ProfileSelected)); int idx = m_LoginList.AddString(newName); if (idx != LB_ERR) { m_LoginList.SetItemDataPtr(idx,XP_STRDUP(newName)); m_LoginList.UpdateWindow(); m_LoginList.SetCurSel(m_LoginList.FindStringExact(-1,newName)); } } } void CLoginDlg::OnOK() { // PE; disable dial-on-demand for all the profiles if(theApp.m_bPEEnabled && !theApp.m_bProfileManager) { CMucProc m_mucProc; CString temp; if(!m_bDialOnDemand) temp = ""; else temp = m_strAcctName; m_mucProc.SetDialOnDemand(temp,m_bDialOnDemand); } CDialog::OnOK(); } void CLoginDlg::OnNewProfile() { char * profile = login_QueryNewProfile(FALSE,this); if (profile) { int idx = m_LoginList.AddString(profile); if (idx != LB_ERR) { m_LoginList.SetItemDataPtr(idx,XP_STRDUP(profile)); m_LoginList.UpdateWindow(); m_LoginList.SetCurSel(m_LoginList.FindStringExact(-1,profile)); } XP_FREE(profile); GetDlgItem(IDOK)->EnableWindow(TRUE); GetDlgItem(IDC_DELETEPROFILE)->EnableWindow(TRUE); GetDlgItem(IDC_EDITPROFILE)->EnableWindow(TRUE); GetDlgItem(IDC_OPTION)->EnableWindow(TRUE); GetDlgItem(IDC_ADVANCED)->EnableWindow(TRUE); OnOK(); } } void CLoginDlg::OnDeleteProfile() { UpdateData(); char szMsg[256]; sprintf(szMsg, szLoadString(IDS_CONFIRM_DELETE), m_ProfileSelected); if (AfxMessageBox(szMsg,MB_YESNO) == IDYES) { login_DeleteUserKey(m_ProfileSelected); m_LoginList.DeleteString(m_LoginList.FindStringExact(-1,m_ProfileSelected)); m_LoginList.SetCurSel(0); AfxMessageBox(szLoadString(IDS_PROFILE_DELETED), MB_OK); } if (m_LoginList.GetCount() <= 0) { GetDlgItem(IDOK)->EnableWindow(FALSE); GetDlgItem(IDC_DELETEPROFILE)->EnableWindow(FALSE); GetDlgItem(IDC_EDITPROFILE)->EnableWindow(FALSE); GetDlgItem(IDC_OPTION)->EnableWindow(FALSE); GetDlgItem(IDC_ADVANCED)->EnableWindow(FALSE); } } BOOL CLoginDlg::OnInitDialog() { CDialog::OnInitDialog(); // PE: profile selector/manager if(theApp.m_bPEEnabled) { if(!theApp.m_bProfileManager) // selector { GetDlgItem(IDC_OPTION)->ShowWindow(SW_HIDE); GetDlgItem(IDC_ADVANCED)->ShowWindow(SW_SHOW); ((CButton*)GetDlgItem(IDC_CHECK))->SetCheck(!m_bDialOnDemand); } else GetDlgItem(IDC_ADVANCED)->ShowWindow(SW_HIDE); } else // none PE { GetDlgItem(IDC_ADVANCED)->ShowWindow(SW_HIDE); GetDlgItem(IDC_OPTION)->ShowWindow(SW_HIDE); /* we used to hide some of the buttons when the profile manager was used as a selector, now with li, we don't do that anymore */ } // dialog display -- we always show the buttons now, so pass in false. DialogDisplay(FALSE); // profile list m_LoginList.SubclassDlgItem(IDC_LOGIN_LIST,this); int idx=0; while (!m_Profiles.IsEmpty()) { char * name = strdup(m_Profiles.RemoveHead()); m_LoginList.AddString(name); //m_LoginList.SetItemData(idx++,(ULONG)(const char *)m_Profiles.RemoveHead()); m_LoginList.SetItemDataPtr(idx++,(void *)name); } m_LoginList.SetCurSel(0); char * name = login_GetCurrentUser(); if (name) { m_LoginList.SelectString(-1,name); free(name); } if (idx == 0) { // we have no profiles -- disable OK/etc GetDlgItem(IDOK)->EnableWindow(FALSE); GetDlgItem(IDC_DELETEPROFILE)->EnableWindow(FALSE); GetDlgItem(IDC_EDITPROFILE)->EnableWindow(FALSE); GetDlgItem(IDC_OPTION)->EnableWindow(FALSE); GetDlgItem(IDC_ADVANCED)->EnableWindow(FALSE); } m_LoginList.SetFocus(); if(theApp.m_bPEEnabled) CheckPEConfig(); return FALSE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CLoginDlg::DialogDisplay(BOOL m_bSelector) { // display window RECT tagRectTop, tagRectBottom; RECT helpTextRect, frameClientRect, listboxRect; RECT frameScreenRect, helpTextScreenRect; GetWindowRect(&rect); GetDlgItem(IDC_TOP_TAG)->GetWindowRect(&tagRectTop); GetDlgItem(IDC_BOTTOM_TAG)->GetWindowRect(&tagRectBottom); m_range = tagRectBottom.bottom - tagRectTop.bottom; SetWindowPos(&wndTop, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top-m_range, SWP_SHOWWINDOW); // display list box if(! m_bSelector) return; GetDlgItem(IDC_FRAME_BOX)->GetClientRect(&frameClientRect); GetDlgItem(IDC_LOGIN_LIST)->GetClientRect(&listboxRect); GetDlgItem(IDC_HELP_TEXT)->GetClientRect(&helpTextRect); GetDlgItem(IDC_FRAME_BOX)->GetWindowRect(&frameScreenRect); GetDlgItem(IDC_HELP_TEXT)->GetWindowRect(&helpTextScreenRect); int m_listBoxWidth = listboxRect.right - listboxRect.left; listboxRect.left = frameScreenRect.left + ((frameClientRect.right - frameClientRect.left) - m_listBoxWidth)/2; listboxRect.right = listboxRect.left + m_listBoxWidth; int m_listBoxHeight = listboxRect.bottom - listboxRect.top; listboxRect.top = helpTextScreenRect.bottom + ((frameScreenRect.bottom - helpTextScreenRect.bottom) - m_listBoxHeight)/2; listboxRect.bottom = listboxRect.top + m_listBoxHeight; ScreenToClient(&listboxRect); GetDlgItem(IDC_LOGIN_LIST)->SetWindowPos(&wndTop, listboxRect.left, listboxRect.top, m_listBoxWidth, m_listBoxHeight, SWP_SHOWWINDOW); // change the dialog title CString m_str; m_str.LoadString(IDS_PROFILE_SELECTOR_TITLE); SetWindowText(m_str); } void CLoginDlg::OnDblclkLoginList() { // TODO: Add your control notification handler code here OnOK(); } void CLoginDlg::OnSelChangeLoginList() { if(theApp.m_bPEEnabled && !theApp.m_bProfileManager) { CheckPEConfig(); GetDlgItem(IDC_ADVANCED_ACCTNAME)->SetWindowText(m_strAcctName); UpdateData(FALSE); } } void CLoginDlg::OnOption() { CheckPEConfig(); CMucViewWizard mucViewWizard(this, m_strProfileName, m_strAcctName, m_strModemName); int ret = mucViewWizard.DoModal(); } /* handles the remote profile case */ void CLoginDlg::OnRemote() { /* if they hit ok - go for it if they don't, let them choose a regular one. */ #ifdef MOZ_LOC_INDEP if (winli_QueryNetworkProfile()) { /* act like they hit ok to close the profile manager.*/ OnOK(); /* set profile selected to null to stop us from getting the profile from the list. Must be done after the ok/dataExchange stuff. */ m_ProfileSelected = ""; } #endif // MOZ_LOC_INDEP } void CLoginDlg::OnAdvance() { m_bRestoreWindow = (m_bRestoreWindow + 1) %2; if(m_bRestoreWindow) { GetWindowRect(&rect); SetWindowPos(&wndTop, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top+m_range, SWP_SHOWWINDOW); SetDlgItemText(IDC_ADVANCED, "Advanced<<"); GetDlgItem(IDC_ADVANCED_ACCTNAME)->SetWindowText(m_strAcctName); UpdateData(FALSE); } else { GetWindowRect(&rect); SetWindowPos(&wndTop, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top-m_range, SWP_SHOWWINDOW); SetDlgItemText(IDC_ADVANCED, "Advanced>>"); } } void CLoginDlg::OnCheck() { m_bDialOnDemand = (m_bDialOnDemand + 1) %2; } void CLoginDlg::CheckPEConfig() { XP_StatStruct statinfo; int ret; char strAcct[MAX_PATH]; char strModem[MAX_PATH]; char path[MAX_PATH+1]; HKEY hKeyRet; char *pString = NULL; long result; DWORD type, size; char name[MAX_PATH]; int curSelect; curSelect = m_LoginList.GetCurSel(); if(curSelect < 0) { m_strAcctName = ""; m_strModemName = ""; m_strProfileName = ""; return; } strcpy(name, (char*)m_LoginList.GetItemDataPtr(curSelect)); // get profile path #ifdef XP_WIN32 strcpy(path, "SOFTWARE\\Netscape\\Netscape Navigator\\Users"); strcat(path, "\\"); strcat(path, name); if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, path, &hKeyRet)) { // see how much space we need size = 0; result = RegQueryValueEx(hKeyRet, "DirRoot", NULL, &type, NULL, &size); // if we didn't find it just use the default if((result == ERROR_SUCCESS) && (size != 0)) { // allocate space to hold the string pString = (char *) XP_ALLOC(size * sizeof(char)); // actually load the string now that we have the space result = RegQueryValueEx(hKeyRet, "DirRoot", NULL, &type, (LPBYTE) pString, &size); if (hKeyRet) RegCloseKey(hKeyRet); } } #else CString csNSCPini; login_GetIniFilePath(csNSCPini); pString = (char *) XP_ALLOC(_MAX_PATH * sizeof(char)); ::GetPrivateProfileString("Users", name,"",pString,_MAX_PATH,csNSCPini); #endif if(pString == NULL) return; ret = _stat(pString, &statinfo); if(ret == 0) { // construct the profile full name strcpy(path, pString); strcat(path, "\\config.ini"); memset(strAcct, 0x00, MAX_PATH); ::GetPrivateProfileString("Account", "Account", "", strAcct, MAX_PATH, path); // ::GetPrivateProfileString("Modem", "Modem", "", strModem, MAX_PATH, path); m_strAcctName = strAcct; // m_strModemName = strModem; } m_strProfileName = path; XP_FREE (pString); } ///////////////////////////////////////////////////////////////////////////// // CLoginList CLoginList::CLoginList(): CListBox() { m_iPosIndex = 0; m_iPosName = 50; m_iPosStatus = 100; } CLoginList::~CLoginList() { } void CLoginList::SetColumnPositions(int iPosIndex, int iPosName, int iPosStatus) { m_iPosIndex = iPosIndex; m_iPosName = iPosName; m_iPosStatus = iPosStatus; } BEGIN_MESSAGE_MAP( CLoginList, CListBox ) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP( ) void CLoginList::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct ) { lpMeasureItemStruct->itemHeight = 32; } void CLoginList::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) { HDC hDC = lpDrawItemStruct->hDC; RECT rcItem = lpDrawItemStruct->rcItem; RECT rcTemp = rcItem; if (!lpDrawItemStruct) return; if (!lpDrawItemStruct->itemData) return; const char * itemData = (const char *)GetItemDataPtr(lpDrawItemStruct->itemID); HBRUSH hBrushFill; #ifndef XP_WIN16 if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { hBrushFill = GetSysColorBrush( COLOR_HIGHLIGHT ); ::SetBkColor( hDC, GetSysColor( COLOR_HIGHLIGHT ) ); ::SetTextColor( hDC, GetSysColor( COLOR_HIGHLIGHTTEXT ) ); } else { hBrushFill = GetSysColorBrush( COLOR_WINDOW ); ::SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) ); ::SetTextColor( hDC, GetSysColor( COLOR_WINDOWTEXT ) ); } #else if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { hBrushFill = CreateSolidBrush( GetSysColor(COLOR_HIGHLIGHT)); ::SetBkColor( hDC, GetSysColor( COLOR_HIGHLIGHT ) ); ::SetTextColor( hDC, GetSysColor( COLOR_HIGHLIGHTTEXT ) ); } else { hBrushFill = CreateSolidBrush( GetSysColor(COLOR_WINDOW) ); ::SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) ); ::SetTextColor( hDC, GetSysColor( COLOR_WINDOWTEXT ) ); } #endif if ( itemData ) { CClientDC dc(this); ::FillRect( hDC, &rcItem, hBrushFill ); rcTemp.left = m_iPosIndex; rcTemp.right = m_iPosName; DrawIcon(hDC,rcTemp.left,rcTemp.top,theApp.LoadIcon(IDR_DOCUMENT)); rcTemp.left = rcTemp.right; rcTemp.right = rcItem.right; ::DrawText( hDC, itemData, -1, &rcTemp, DT_VCENTER|DT_LEFT|DT_SINGLELINE ); } #ifdef XP_WIN16 if (hBrushFill) DeleteObject(hBrushFill); #endif } char szProfileName[] = "Profile Name:"; char szUserDirectory[] = "UserDirectory"; void CLoginList::OnLButtonDown( UINT nFlags, CPoint point ) { CListBox::OnLButtonDown( nFlags, point ); } #include "dialog.h" #include "setupwiz.h" int PR_CALLBACK ProfilePrefChangedFunc(const char *pref, void *data) { if ((!XP_STRCASECMP(pref,"mail.identity.username")) || (!XP_STRCASECMP(pref,"mail.identity.useremail"))) { char * name = login_GetCurrentUser(); if (name) { login_SetUserKeyData(name); } } return 0; } // The magical prefix of $ROOT in a URL will take us to the directory // that the program was run from. If that feature should die, this will // have to contain some real code... char * GetASWURL() { char *pString = "$ROOT\\ASW\\start.htm"; return XP_STRDUP(pString); } // This function will attempt to create a new profile. This // includes setting up the registry key as well as creating // the corresponding user directory char * login_QueryNewProfile(BOOL bUpgrade,CWnd *parent) { CNewProfileWizard setupWizard(parent,bUpgrade); int ret = setupWizard.DoModal(); if (!setupWizard.m_pProfileName.IsEmpty()) { char * ret = XP_STRDUP(setupWizard.m_pProfileName); return ret; } else return NULL; } int login_RenameUserKey(const char *oldName, const char* newName) { long result; int fieldLen = 0; if (!strcmpi(oldName,newName)) return FALSE; #ifdef XP_WIN32 HKEY hKeyRet; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; CString newPath,oldPath; HKEY hKeyNewName; HKEY hKeyOldName; DWORD dwDisposition; newPath = csSub+newName; oldPath = csSub+oldName; // create a new key for our new profile name if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, newPath, NULL, NULL, NULL, KEY_WRITE, NULL, &hKeyNewName, &dwDisposition)) { // now... we enumerate old profile key contents and copy everything into new profile key // first, gets the hkey for the old profile path if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, oldPath, NULL, KEY_WRITE | KEY_READ, &hKeyOldName)) { DWORD subKeys; DWORD maxSubKeyLen; DWORD maxClassLen; DWORD values; DWORD maxValueNameLen; DWORD maxValueLen; DWORD securityDescriptor; FILETIME lastWriteTime; // get some information about this old profile key if (ERROR_SUCCESS == RegQueryInfoKey(hKeyOldName, NULL, NULL, NULL, &subKeys, &maxSubKeyLen, &maxClassLen, &values, &maxValueNameLen, &maxValueLen, &securityDescriptor, &lastWriteTime)) { // copy the values BOOL NoErr = CopyRegKeys(hKeyOldName, hKeyNewName, subKeys, maxSubKeyLen, maxClassLen, values, maxValueNameLen, maxValueLen, oldPath, newPath); // delete the old Key, if everything went well if (NoErr) { login_DeleteUserKey(oldName); } } } RegCloseKey(hKeyNewName); RegCloseKey(hKeyOldName); return TRUE; } #else CString csNSCPini; login_GetIniFilePath(csNSCPini); // get old dir char *pString = (char *) XP_ALLOC(_MAX_PATH * sizeof(char)); ::GetPrivateProfileString("Users", oldName,"",pString,_MAX_PATH,csNSCPini); // blank out old name now ::WritePrivateProfileString("Users", oldName, NULL,csNSCPini); result = ::WritePrivateProfileString("Users", newName, pString,csNSCPini); if (pString) XP_FREE(pString); #endif return TRUE; } int login_CreateNewUserKey(const char *profileName, const char* directory) { long result; char *nullString = ""; char *email, *username; int fieldLen = 0; if (PREF_GetCharPref("mail.identity.useremail", NULL, &fieldLen) == PREF_NOERROR) { email = (char *) XP_ALLOC(fieldLen); if (email) { PREF_GetCharPref("mail.identity.useremail", email, &fieldLen); } else { email = nullString; } } fieldLen = 0; if (PREF_GetCharPref("mail.identity.username", NULL, &fieldLen) == PREF_NOERROR) { username = (char *) XP_ALLOC(fieldLen); if (username) { PREF_GetCharPref("mail.identity.username", username, &fieldLen); } else { username = nullString; } } #ifdef XP_WIN32 HKEY hKeyRet; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; csSub += profileName; result = RegCreateKey(HKEY_LOCAL_MACHINE, csSub, &hKeyRet); result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csSub, NULL, KEY_SET_VALUE, &hKeyRet); if (result == ERROR_SUCCESS) { RegSetValueEx(hKeyRet,"DirRoot",NULL,REG_SZ,(const BYTE *)directory,strlen(directory)+1); RegSetValueEx(hKeyRet,"UserName",NULL,REG_SZ,(const BYTE *)username,strlen(username)+1); RegSetValueEx(hKeyRet,"EmailAddr",NULL,REG_SZ,(const BYTE *)email,strlen(email)+1); RegCloseKey(hKeyRet); } else { AfxMessageBox(szLoadString(IDS_UNABLE_WRITE_REG)); } #else CString csNSCPini; login_GetIniFilePath(csNSCPini); result = ::WritePrivateProfileString("Users", profileName, directory,csNSCPini); #endif return CASTINT(result); } #ifdef XP_WIN32 // this wasn't exported anywhere! extern LONG RegDeleteKeyNT(HKEY hStartKey, LPCSTR lpszKeyName); #endif int login_DeleteUserKey(const char *profileName) { long result; #ifdef XP_WIN32 HKEY hKeyRet; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csSub, NULL, KEY_WRITE, &hKeyRet); if (result == ERROR_SUCCESS) { RegDeleteKeyNT(hKeyRet,profileName); } if (hKeyRet) RegCloseKey(hKeyRet); #else CString csNSCPini; login_GetIniFilePath(csNSCPini); result = ::WritePrivateProfileString("Users", profileName, NULL,csNSCPini); #endif return CASTINT(result); } int login_SetUserKeyData(const char *profileName) { long result; char *nullString = ""; char *email, *username; int fieldLen = 0; if (PREF_GetCharPref("mail.identity.useremail", NULL, &fieldLen) == PREF_NOERROR) { email = (char *) XP_ALLOC(fieldLen); if (email) { PREF_GetCharPref("mail.identity.useremail", email, &fieldLen); } else { email = nullString; } } fieldLen = 0; if (PREF_GetCharPref("mail.identity.username", NULL, &fieldLen) == PREF_NOERROR) { username = (char *) XP_ALLOC(fieldLen); if (username) { PREF_GetCharPref("mail.identity.username", username, &fieldLen); } else { username = nullString; } } #ifdef XP_WIN32 HKEY hKeyRet; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; csSub += profileName; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csSub, NULL, KEY_SET_VALUE, &hKeyRet); if (result == ERROR_SUCCESS) { RegSetValueEx(hKeyRet,"UserName",NULL,REG_SZ,(const BYTE *)username,strlen(username)+1); RegSetValueEx(hKeyRet,"EmailAddr",NULL,REG_SZ,(const BYTE *)email,strlen(email)+1); RegCloseKey(hKeyRet); } #else #endif return CASTINT(result); } int login_SetCurrentUser(const char * user) { long result; #ifdef XP_WIN32 HKEY hKeyRet = NULL; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csSub, NULL, KEY_SET_VALUE, &hKeyRet); if (result == ERROR_SUCCESS) { RegSetValueEx(hKeyRet,"CurrentUser",NULL,REG_SZ,(const BYTE *)user,strlen(user)+1); RegCloseKey(hKeyRet); } #else CString csNSCPini; login_GetIniFilePath(csNSCPini); result = ::WritePrivateProfileString("Users Additional Info", "CurrentUser", user,csNSCPini); #endif return CASTINT(result); } // checks to see if we think somebody has already used Navigator on this machine Bool login_UpgradeNeeded(void) { // lets just try to load the homepage CString csPref= theApp.GetProfileString("Main","Home Page",""); if (!csPref.IsEmpty()) return TRUE; csPref= theApp.GetProfileString("User","User_Addr",""); if (!csPref.IsEmpty()) return TRUE; csPref= theApp.GetProfileString("User","User_Name",""); if (!csPref.IsEmpty()) return TRUE; csPref= theApp.GetProfileString("Bookmark List","File Location",""); if (!csPref.IsEmpty()) return TRUE; return FALSE; } int PR_CALLBACK ProfileNameChangedFunc(const char *pref, void *data) { if (!pref) return FALSE; if (!data) return FALSE; if (!strcmpi(pref,"profile.name") ) { LPSTR lpszNewName = NULL; PREF_CopyCharPref("profile.name", &lpszNewName); login_RenameUserKey((char *)data,lpszNewName); if (lpszNewName) XP_FREE(lpszNewName); return TRUE; } return FALSE; } #ifdef NEW_PREF_ARCH int login_NewProfilePreInit() { /* There's still some wacky stuff that the WinFE needs to do that hasn't been rolled into the new profile/preference management. This is where that goes */ //------------------------------------------------------------------------------------------------ // KLUDGE! // The Account Setup Wizard is now a Java/Javascript application. Since they have no control // over the profile that will contain the preference changes, we use a hidden magic profile to // hold their changes until they're done MUCKing about. When they've finished, they will // rename the profile based on user inputs. If all goes well, the magic profile never outlives // any given instance of the navigator/ASW. However, if anything fails the magic profile could // be left lying about. This would be bad. // // The most unfortunate occurance of this problem would be while creating the first profile. // In this case, we don't know the user hasn't successfully created a profile unless we check // to see if the magic profile is the only one. The simplest way to handle this is to just // expunge the magic profile whenever we get here and find that it exists. //------------------------------------------------------------------------------------------------ // // Delete the magic profile if it exists CUserProfileDB profileDB; profileDB.DeleteUserProfile( ASW_MAGIC_PROFILE_NAME ); return 0; } int login_NewProfilePostInit(CProfile *pProfile) { /* There's still some wacky stuff that the WinFE needs to do that hasn't been rolled into the new profile/preference management. This is where that goes */ char profileName[81]; char profilePW[41]; int nameLength = 80; int error = 0; PREF_GetCharPref("profile.name", profileName, &nameLength); #ifdef MOZ_LOC_INDEP // read in the preference file (will assume valid dir here...we need to know if LI) XP_Bool prefBool=FALSE; PREF_GetBoolPref("li.enabled",&prefBool); if (prefBool) { CPrefStoreLocal *pLIStore; CString csLIPrefsPath; BOOL loginSuccess; pProfile->GetProfilePassword(profilePW, 40); PREF_SetCharPref("li.login.password",profilePW); loginSuccess = FEU_StartGetCriticalFiles(profileName,theApp.m_UserDirectory); /* Ok, now we're back, so add the liprefs into the mix and reload from there */ if (loginSuccess) { XP_StatStruct statinfo; int ret; csLIPrefsPath = theApp.m_UserDirectory + "\\liprefs.js"; ret = _stat(csLIPrefsPath, &statinfo); if(ret != -1) { pLIStore = new CPrefStoreLocalLI("liprefs.js", csLIPrefsPath); pProfile->AddPrefsStoreBefore(pLIStore, "profile.cfg"); pProfile->LoadPrefs("liprefs.js", TRUE); } } else { error = -1; } } #endif return error; } #endif int login_QueryForCurrentProfile() { CLoginDlg dlg; Bool bGotoASW = FALSE; Bool bFirstTimeUser; Bool bUpgradeNeeded; Bool bRet; int numProfiles; char * pString = NULL; CString csProfileSelected; char aPath[_MAX_PATH]; ::GetModuleFileName(theApp.m_hInstance, aPath, _MAX_PATH); // Kill the last slash and everything after it char *pSlash = ::strrchr(aPath, '\\'); if(pSlash) *pSlash = '\0'; CString csLockFile = aPath; csLockFile += "\\netscape.cfg"; // we need to read this early so that any defaults get set for the setup wizard's use. // we will read it again at the end to overwrite any user settings PREF_ReadLockFile(csLockFile); csProfileSelected.Empty(); if (theApp.m_bNetworkProfile) { #ifdef MOZ_LOC_INDEP return winli_QueryNetworkProfile(); #else return FALSE; #endif // MOZ_LOC_INDEP } //------------------------------------------------------------------------------------------------ // KLUDGE! // The Account Setup Wizard is now a Java/Javascript application. Since they have no control // over the profile that will contain the preference changes, we use a hidden magic profile to // hold their changes until they're done MUCKing about. When they've finished, they will // rename the profile based on user inputs. If all goes well, the magic profile never outlives // any given instance of the navigator/ASW. However, if anything fails the magic profile could // be left lying about. This would be bad. // // The most unfortunate occurance of this problem would be while creating the first profile. // In this case, we don't know the user hasn't successfully created a profile unless we check // to see if the magic profile is the only one. The simplest way to handle this is to just // expunge the magic profile whenever we get here and find that it exists. //------------------------------------------------------------------------------------------------ // // Delete the magic profile if it exists CUserProfileDB profileDB; profileDB.DeleteUserProfile( ASW_MAGIC_PROFILE_NAME ); profileDB.GetUserProfilesList( &dlg.m_Profiles ); bFirstTimeUser = dlg.m_Profiles.IsEmpty(); numProfiles = dlg.m_Profiles.GetCount(); if (bFirstTimeUser) bUpgradeNeeded = login_UpgradeNeeded(); else bUpgradeNeeded = FALSE; ///////////////////////////////////////////////////////////////////////////////////// // The account setup flag and the new profile flag are basically mutually exclusive, // but check the account setup flag first just in case. The account setup flag is // an override that causes the account setup wizard to run instead of the profile // wizard // //----------------------------------------------------------- // Decide what to do between MUP/MUC/ASW //----------------------------------------------------------- if (bFirstTimeUser && theApp.m_bPEEnabled) { // PE! // Disable -profile_manager in this case since we don't // want first-time users to see it for PE theApp.m_bProfileManager = FALSE; if (bUpgradeNeeded) { // Upgrades do upgrade dialog and then to ASW if (!login_QueryNewProfile(bUpgradeNeeded,NULL)) return FALSE; // Tell ASW to go to Upgrade screen PREF_SetBoolPref("account_setup.upgraded", TRUE); } else { // Very first _account_ (this _is_ PE after all) // Get a directory name that'll work on the current system CString theDirectory; if (!profileDB.AssignProfileDirectoryName(ASW_MAGIC_PROFILE_NAME, theDirectory)) return FALSE; // Create the Magic Profile for ASW profileDB.AddNewProfile(ASW_MAGIC_PROFILE_NAME, theDirectory, UPGRADE_IGNORE ); bGotoASW = TRUE; } // We now have exactly one profile } else if (theApp.m_bPEEnabled && theApp.m_bAccountSetup) { // PE, Some normal profile(s) exists and ASW requested bGotoASW = TRUE; } else if ((bFirstTimeUser || theApp.m_bCreateNewProfile) && !theApp.m_bProfileManager) { // No profiles or -new_profile requested char * profile = login_QueryNewProfile(bUpgradeNeeded,NULL); if (!profile) return FALSE; else { login_SetCurrentUser(profile); } } // This information may have changed profileDB.GetUserProfilesList( &dlg.m_Profiles ); numProfiles = dlg.m_Profiles.GetCount(); PREF_SetDefaultIntPref( "profile.numprofiles", numProfiles ); // See if we need to do wizardry to get to ASW if (bGotoASW) { char *asw = GetASWURL(); theApp.m_csPEPage = asw; theApp.m_bAlwaysDockTaskBar = TRUE; XP_FREEIF(asw); theApp.m_bAccountSetup = TRUE; theApp.m_bAccountSetupStartupJava = TRUE; // Need this here too... } else theApp.m_bAccountSetup = FALSE; theApp.m_bCreateNewProfile = FALSE; // already did it if (theApp.m_bProfileManager) { if (dlg.DoModal()==IDCANCEL) { return FALSE; }; csProfileSelected =(const char *)dlg.m_ProfileSelected; } else { if (numProfiles == 0) { assert(0); theApp.m_bCreateNewProfile = TRUE; // Do it again! return login_QueryForCurrentProfile(); // run us again } if (numProfiles == 1) { // we only have one profile -- just use it! csProfileSelected = dlg.m_Profiles.GetHead(); } else if (theApp.m_CmdLineProfile) { csProfileSelected = theApp.m_CmdLineProfile; } else { // ask the user to choose! if (dlg.DoModal()==IDCANCEL) { return FALSE; } else if (dlg.m_ProfileSelected == "") return TRUE; // LI NetProfile selected. csProfileSelected =(const char *)dlg.m_ProfileSelected; } } /* we have the profile, publish the name as a pref */ PREF_SetDefaultCharPref( "profile.name", csProfileSelected ); pString = profileDB.GetUserProfileValue( csProfileSelected, "DirRoot" ); // read in the preference file (will assume valid dir here...we need to know if LI) // REMIND: JEM: we now read prefs twice...just to find this one pref...we should parse the file CString csTmp = pString; csTmp += "\\prefs.js"; #ifdef NEW_PREF_ARCH PREF_Init(); #else PREF_Init((char *)(const char *)csTmp); #endif XP_Bool prefBool=FALSE; PREF_GetBoolPref("li.enabled",&prefBool); theApp.m_UserDirectory = pString; if (pString) PREF_SetDefaultCharPref( "profile.directory", pString ); // I figure this is safe since "li.enabled" should always be false if not MOZ_LOC_INDEP #ifdef MOZ_LOC_INDEP if (prefBool) bRet = FEU_StartGetCriticalFiles(csProfileSelected,pString); else #endif // MOZ_LOC_INDEP bRet = login_ProfileSelectedCompleteTheLogin(csProfileSelected,pString); // Careful, the above line is actually inside an if statement. XP_FREEIF(pString); return bRet; } Bool login_ProfileSelectedCompleteTheLogin(const char * szProfileName, const char * szProfileDir) { CString csTmp; // verify directory exists XP_StatStruct statinfo; int ret = _stat((char *)(const char *)theApp.m_UserDirectory, &statinfo); if(ret == -1) { char szMsg[256]; sprintf(szMsg, szLoadString(IDS_BAD_DIRECTORY2), theApp.m_UserDirectory); int choice = AfxMessageBox(szMsg,MB_OKCANCEL); if (choice == IDOK) { theApp.m_bCreateNewProfile = TRUE; // force wizard to run theApp.m_bProfileManager = FALSE; return login_QueryForCurrentProfile(); // run us again } else return FALSE; } // this call needs to be done after the last chance that profile.name would inadvertantly change // in other words, it needs to be below the above recursive call to login_QueryForCurrentProfile() PREF_RegisterCallback("profile.name",ProfileNameChangedFunc,(void *)(const char *)szProfileName); // read in the preference file which we read-write csTmp = theApp.m_UserDirectory; csTmp += "\\prefs.js"; #ifdef NEW_PREF_ARCH PREF_Init(); #else PREF_Init((char *)(const char *)csTmp); #endif #ifdef MOZ_LOC_INDEP // read in the user's LI prefs file char * prefName = WH_FileName(NULL, xpLIPrefs); PREF_ReadLIJSFile(prefName); XP_FREEIF (prefName); #endif // read in the users optional JS file csTmp = theApp.m_UserDirectory; csTmp += "\\user.js"; PREF_ReadUserJSFile((char *)(const char *)csTmp); #ifndef MOZ_NGLAYOUT // read in the users optional JS HTML Hook file csTmp = theApp.m_UserDirectory; csTmp += "\\hook.js"; HK_ReadHookFile((char *)(const char *)csTmp); #endif /* MOZ_NGLAYOUT */ char aPath[_MAX_PATH]; ::GetModuleFileName(theApp.m_hInstance, aPath, _MAX_PATH); // Kill the last slash and everything after it char *pSlash = ::strrchr(aPath, '\\'); if(pSlash) *pSlash = '\0'; CString csLockFile = aPath; csLockFile += "\\netscape.cfg"; // check for required file: netscape.cfg if (!FEU_SanityCheckFile(csLockFile)) { AfxMessageBox(szLoadString(IDS_MISSING_CFG)); return FALSE; } // read the optional profile.cfg file CString csProfileCfg; csProfileCfg = theApp.m_UserDirectory; csProfileCfg += "\\profile.cfg"; PREF_ReadLockFile(csProfileCfg); if (PREF_ReadLockFile(csLockFile) == PREF_BAD_LOCKFILE) { AfxMessageBox(szLoadString(IDS_INVALID_CFG)); return FALSE; } PREF_SavePrefFile(); // explicit save to get any prefs set before filename was set login_SetCurrentUser(szProfileName); PREF_RegisterCallback("mail.identity",ProfilePrefChangedFunc, NULL); return TRUE; } char * login_GetCurrentUser() { long result; #ifdef XP_WIN32 DWORD type, size; HKEY hKeyRet; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csSub, NULL, KEY_QUERY_VALUE, &hKeyRet); if (result != ERROR_SUCCESS) { return NULL; } // see how much space we need result = RegQueryValueEx(hKeyRet, (char *) "CurrentUser", NULL, &type, NULL, &size); // if we didn't find it error! if((result != ERROR_SUCCESS) || (size == 0)) //AfxMessageBox("Unable to determine last user"); return NULL; // allocate space to hold the string char * pString = (char *) XP_ALLOC(size * sizeof(char)); // actually load the string now that we have the space result = RegQueryValueEx(hKeyRet, (char *) "CurrentUser", NULL, &type, (LPBYTE) pString, &size); if((result != ERROR_SUCCESS) || (size == 0)) return NULL; if (hKeyRet) RegCloseKey(hKeyRet); return pString; #else auto char ca_iniBuff[_MAX_PATH]; CString csNSCPini; login_GetIniFilePath(csNSCPini); if (::GetPrivateProfileString("Users Additional Info", "CurrentUser","",ca_iniBuff,_MAX_PATH,csNSCPini)) return XP_STRDUP(ca_iniBuff); else return NULL; #endif } char *login_GetUserByName(const char *userName) { long result; char *matchedProfile = NULL; #ifdef XP_WIN32 HKEY hKeyRet; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; DWORD keyIndex = 0, usernameLen; auto char subkeyName[MAX_PATH+1]; char *pUserString; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csSub, NULL, KEY_READ, &hKeyRet); while ((result == ERROR_SUCCESS) && (!matchedProfile)) { if ((result = RegEnumKey(hKeyRet, keyIndex++, subkeyName, MAX_PATH+1)) == ERROR_SUCCESS) { CString csKeyName = csSub + subkeyName; HKEY hSubkeyRet; if ((result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csKeyName, NULL, KEY_READ, &hSubkeyRet)) == ERROR_SUCCESS) { // see how much space we need usernameLen = 0; result = RegQueryValueEx(hSubkeyRet, (char *) "UserName", NULL, NULL, NULL, &usernameLen); if (result == ERROR_SUCCESS) { // allocate space to hold the string pUserString = (char *) XP_ALLOC(usernameLen * sizeof(char)); if (pUserString) { // actually load the string now that we have the space result = RegQueryValueEx(hSubkeyRet, (char *) "UserName", NULL, NULL, (LPBYTE) pUserString, &usernameLen); if ((result == ERROR_SUCCESS) && (XP_STRCMP(pUserString, userName) == 0)) { matchedProfile = XP_STRDUP(subkeyName); } XP_FREE(pUserString); } } RegCloseKey(hSubkeyRet); } // if we have a problem reading this entry, still go on to the next result = ERROR_SUCCESS; } } RegCloseKey(hKeyRet); #else /* CString csNSCPini; login_GetIniFilePath(csNSCPini); result = ::WritePrivateProfileString("Users", profileName, NULL,csNSCPini); */ #endif return matchedProfile; } char *login_GetUserByEmail(const char *email) { long result; char *matchedProfile = NULL; #ifdef XP_WIN32 HKEY hKeyRet; CString csSub = "SOFTWARE\\Netscape\\Netscape Navigator\\Users\\"; DWORD keyIndex = 0, emailLen; auto char subkeyName[MAX_PATH+1]; char *pEmailString; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csSub, NULL, KEY_READ, &hKeyRet); while ((result == ERROR_SUCCESS) && (!matchedProfile)) { if ((result = RegEnumKey(hKeyRet, keyIndex++, subkeyName, MAX_PATH+1)) == ERROR_SUCCESS) { CString csKeyName = csSub + subkeyName; HKEY hSubkeyRet; if ((result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csKeyName, NULL, KEY_READ, &hSubkeyRet)) == ERROR_SUCCESS) { // see how much space we need emailLen = 0; result = RegQueryValueEx(hSubkeyRet, (char *) "EmailAddr", NULL, NULL, NULL, &emailLen); if (result == ERROR_SUCCESS) { // allocate space to hold the string pEmailString = (char *) XP_ALLOC(emailLen * sizeof(char)); if (pEmailString) { // actually load the string now that we have the space result = RegQueryValueEx(hSubkeyRet, (char *) "EmailAddr", NULL, NULL, (LPBYTE) pEmailString, &emailLen); if ((result == ERROR_SUCCESS) && (XP_STRCMP(pEmailString, email) == 0)) { matchedProfile = XP_STRDUP(subkeyName); } XP_FREE(pEmailString); } } RegCloseKey(hSubkeyRet); } // if we have a problem reading this entry, still go on to the next result = ERROR_SUCCESS; } } RegCloseKey(hKeyRet); #else /* CString csNSCPini; login_GetIniFilePath(csNSCPini); result = ::WritePrivateProfileString("Users", profileName, NULL,csNSCPini); */ #endif return matchedProfile; } #ifdef XP_WIN32 #define MY_FINDFIRST(a,b) FindFirstFile(a,b) #define MY_FINDNEXT(a,b) FindNextFile(a,b) #define ISDIR(a) (a.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) #define MY_FINDCLOSE(a) FindClose(a) #define MY_FILENAME(a) a.cFileName #define MY_FILESIZE(a) (a.nFileSizeHigh * MAXDWORD) + a.nFileSizeLow #else static unsigned u_finding = _A_NORMAL | _A_RDONLY | _A_ARCH | _A_SUBDIR; #define MY_FINDFIRST(a,b) (_dos_findfirst(a,u_finding,b)==0) #define MY_FINDNEXT(a,b) (_dos_findnext(b)==0) #define ISDIR(a) (a.attrib & _A_SUBDIR) #define MY_FINDCLOSE(a) a=INVALID_HANDLE_VALUE #define MY_FILENAME(a) a.name #define MY_FILESIZE(a) a.size #endif int WFEU_CheckDiskSpaceForMove(CString src,CString dst,uint32 * iSpaceNeeded) { #ifdef XP_WIN16 struct _find_t data_ptr; unsigned find_handle; #else WIN32_FIND_DATA data_ptr; HANDLE find_handle; #endif // Append slash to the end of the directory names if not there if (dst.Right(1) != "\\") dst += "\\"; if (src.Right(1) != "\\") src += "\\"; find_handle = MY_FINDFIRST(src+"*.*", &data_ptr); if (find_handle != INVALID_HANDLE_VALUE) { do { if (ISDIR(data_ptr) && (strcmpi(MY_FILENAME(data_ptr),".")) && (strcmpi(MY_FILENAME(data_ptr),".."))) { WFEU_CheckDiskSpaceForMove( src + MY_FILENAME(data_ptr), dst + MY_FILENAME(data_ptr), iSpaceNeeded); } else if (!ISDIR(data_ptr)) { *iSpaceNeeded+= MY_FILESIZE(data_ptr); } } while(MY_FINDNEXT(find_handle,&data_ptr)); MY_FINDCLOSE(find_handle); } return TRUE; } #ifndef XP_WIN16 // doesn't work in win16...copy individual files int WFEU_MoveDirectorySameDrive(CString src,CString dst,CUpdateFileDlg * pDlg,char *category) { // Append slash to the end of the directory names if not there if (dst.Right(1) != "\\") dst += "\\"; if (src.Right(1) != "\\") src += "\\"; // update status dialog if (pDlg) pDlg->StartFileUpdate(category,(char *)(const char *)src); BOOL bRet = WFE_MoveFile(src,dst); return (bRet); } #endif // int WFEU_MoveDirectoryRecursiveDiffDrive(CString src,CString dst,CUpdateFileDlg * pDlg,char *category,XP_Bool bCopyDontMove) { #ifdef XP_WIN16 struct _find_t data_ptr; unsigned find_handle; #else WIN32_FIND_DATA data_ptr; HANDLE find_handle; #endif #ifdef XP_WIN16 // before the extra slash _mkdir(dst); #endif // Append slash to the end of the directory names if not there if (dst.Right(1) != "\\") dst += "\\"; if (src.Right(1) != "\\") src += "\\"; #ifdef XP_WIN32 // this wants (or at least tolerates the extra slash) CreateDirectory(dst, NULL); #endif find_handle = MY_FINDFIRST(src+"*.*", &data_ptr); if (find_handle != INVALID_HANDLE_VALUE) { do { if (ISDIR(data_ptr) && (strcmpi(MY_FILENAME(data_ptr),".")) && (strcmpi(MY_FILENAME(data_ptr),".."))) { WFEU_MoveDirectoryRecursiveDiffDrive( src + MY_FILENAME(data_ptr), dst + MY_FILENAME(data_ptr), pDlg, category, bCopyDontMove); } else if (!ISDIR(data_ptr)) { if (pDlg) pDlg->StartFileUpdate(category,MY_FILENAME(data_ptr)); if (bCopyDontMove) WFE_CopyFile(src + MY_FILENAME(data_ptr), dst + MY_FILENAME(data_ptr)); else WFE_MoveFile(src + MY_FILENAME(data_ptr), dst + MY_FILENAME(data_ptr)); } } while(MY_FINDNEXT(find_handle,&data_ptr)); MY_FINDCLOSE(find_handle); return TRUE; } return FALSE; } // duplicate of line #1323 in mknewsgr.c -- Bad but don't wanna mess with header files #define NEWSRC_MAP_FILE_COOKIE "netscape-newsrc-map-file" int WFEU_UpdateNewsFatFile(CString src,CString dst) { XP_File src_fp,dst_fp; XP_StatStruct stats; long fileLength; CString csSrcFat,csDstFat; // Append slash to the end of the directory names if not there if (dst.Right(1) != "\\") dst += "\\"; if (src.Right(1) != "\\") src += "\\"; csSrcFat = src + "fat"; csDstFat = dst + "fat.new"; if (_stat(csSrcFat, &stats) == -1) return FALSE; fileLength = stats.st_size; if (fileLength <= 1) return FALSE; src_fp = fopen(csSrcFat, "r"); dst_fp = fopen(csDstFat, "wb"); if (src_fp && dst_fp) { char buffer[512]; char psuedo_name[512]; char filename[512]; char is_newsgroup[512]; // This code is all stolen from mknewsgr.c -- written by JRE /* get the cookie and ignore */ XP_FileReadLine(buffer, sizeof(buffer), src_fp); XP_FileWrite(NEWSRC_MAP_FILE_COOKIE, XP_STRLEN(NEWSRC_MAP_FILE_COOKIE), dst_fp); XP_FileWrite(LINEBREAK, XP_STRLEN(LINEBREAK), dst_fp); while(XP_FileReadLine(buffer, sizeof(buffer), src_fp)) { char * p; int i; filename[0] = '\0'; is_newsgroup[0]='\0'; for (i = 0, p = buffer; *p && *p != '\t' && i < 500; p++, i++) psuedo_name[i] = *p; psuedo_name[i] = '\0'; if (*p) { for (i = 0, p++; *p && *p != '\t' && i < 500; p++, i++) filename[i] = *p; filename[i]='\0'; if (*p) { for (i = 0, p++; *p && *p != '\r' && *p != '\n' && i < 500; p++, i++) is_newsgroup[i] = *p; is_newsgroup[i]='\0'; } } CString csFilename = filename; CString csDestFilename = dst; int iLastSlash = csFilename.ReverseFind('\\'); if (iLastSlash != -1) { csDestFilename += csFilename.Right(csFilename.GetLength()-iLastSlash-1); } else csDestFilename += filename; // write routines stolen from mknewsgr.c -- line #1348 XP_FileWrite(psuedo_name, XP_STRLEN(psuedo_name),dst_fp); XP_FileWrite("\t", 1, dst_fp); XP_FileWrite((const char *)csDestFilename, csDestFilename.GetLength() , dst_fp); XP_FileWrite("\t", 1, dst_fp); XP_FileWrite(is_newsgroup, XP_STRLEN(is_newsgroup), dst_fp); XP_FileWrite(LINEBREAK, XP_STRLEN(LINEBREAK), dst_fp); } XP_FileClose(src_fp); XP_FileClose(dst_fp); } else return FALSE; return TRUE; } int WFEU_UpdaterCopyDirectory(CString src,CString dst,CUpdateFileDlg * pDlg,char *category) { uint32 iSpaceNeeded = 0; uint32 iSpaceAvailable = 0; DWORD dwSectorsPerCluster, dwBytesPerSector, dwNumFreeClusters, dwTotalClusters; // assumes properly formated destination string GetDiskFreeSpace(dst.Left(3),&dwSectorsPerCluster,&dwBytesPerSector, &dwNumFreeClusters,&dwTotalClusters); iSpaceAvailable = (dwNumFreeClusters * dwSectorsPerCluster * dwBytesPerSector); WFEU_CheckDiskSpaceForMove(src,dst,&iSpaceNeeded); while (iSpaceNeeded > iSpaceAvailable) { char szLen[64]; _ltoa(((iSpaceNeeded-iSpaceAvailable)/1024)/1024,szLen,10); char szMsg[1024]; sprintf(szMsg, szLoadString(IDS_INSUFFICIENT_DISKSPACE_COPY), category, src, dst, szLen); if (AfxMessageBox(szMsg,MB_OKCANCEL) == IDCANCEL) return FALSE; GetDiskFreeSpace(dst.Left(3),&dwSectorsPerCluster,&dwBytesPerSector, &dwNumFreeClusters,&dwTotalClusters); iSpaceAvailable = (dwNumFreeClusters * dwSectorsPerCluster * dwBytesPerSector); } return WFEU_MoveDirectoryRecursiveDiffDrive(src,dst,pDlg,category,TRUE); } int WFEU_UpdaterMoveDirectory(CString src,CString dst,CUpdateFileDlg * pDlg,char *category) { #ifndef XP_WIN16 // directory rename doesn't work under win16 int iDiffDrive = src.Left(2).CompareNoCase(dst.Left(2)); if (!iDiffDrive) { int iRet = WFEU_MoveDirectorySameDrive(src,dst,pDlg,category); if (iRet) return iRet; } #else int iDiffDrive = TRUE; #endif // else if DiffDrive or if move same drive failed... if (iDiffDrive) { uint32 iSpaceNeeded = 0; uint32 iSpaceAvailable = 0; DWORD dwSectorsPerCluster, dwBytesPerSector, dwNumFreeClusters, dwTotalClusters; // assumes properly formated destination string GetDiskFreeSpace(dst.Left(3),&dwSectorsPerCluster,&dwBytesPerSector, &dwNumFreeClusters,&dwTotalClusters); iSpaceAvailable = (dwNumFreeClusters * dwSectorsPerCluster * dwBytesPerSector); WFEU_CheckDiskSpaceForMove(src,dst,&iSpaceNeeded); while (iSpaceNeeded > iSpaceAvailable) { char szLen[64]; _ltoa(((iSpaceNeeded-iSpaceAvailable)/1024)/1024,szLen,10); char szMsg[1024]; sprintf(szMsg, szLoadString(IDS_INSUFFICIENT_DISKSPACE_MOVE), category, src, dst, szLen); if (AfxMessageBox(szMsg,MB_OKCANCEL) == IDCANCEL) return FALSE; GetDiskFreeSpace(dst.Left(3),&dwSectorsPerCluster,&dwBytesPerSector, &dwNumFreeClusters,&dwTotalClusters); iSpaceAvailable = (dwNumFreeClusters * dwSectorsPerCluster * dwBytesPerSector); } } return WFEU_MoveDirectoryRecursiveDiffDrive(src,dst,pDlg,category,FALSE); } static struct update_PrefTable prefUpdater[] = { {"browser.cache.disk_cache_ssl","Cache","Disk Cache SSL",PREF_BOOL}, {"browser.cache.disk_cache_size","Cache","Disk Cache Size",PREF_INT}, {"browser.cache.memory_cache_size","Cache","Memory Cache Size",PREF_INT}, // {"security.enable_java","Java","Enable Java",PREF_BOOL}, {"security.enable_javascript","Java","Enable JavaScript",PREF_BOOL}, // {"mail.check_time","Mail","Check Time",PREF_INT}, {"mail.max_size","Mail","Max Size",PREF_INT}, {"mail.pop_password","Mail","POP Password",PREF_CHAR}, {"mail.pop_name","Mail","POP Name",PREF_CHAR}, {"mail.leave_on_server","Mail","Leave on server",PREF_BOOL}, {"mail.auto_quote","Mail","Auto quote",PREF_BOOL}, {"mail.remember_password","Mail","Remember Password",PREF_BOOL}, // {"browser.underline_anchors","Main","Anchor Underline",PREF_BOOL}, {"browser.cache.check_doc_frequency","Main","Check Server",PREF_INT}, {"browser.download_directory","Main","Default Save Dir",PREF_CHAR}, {"browser.wfe.ignore_def_check","Main","Ignore DefCheck",PREF_BOOL}, {"browser.startup.homepage","Main","Home Page",PREF_CHAR}, // {"security.submit_email_forms","Network","Warn Submit Email Form",PREF_BOOL}, {"security.email_as_ftp_password","Network","Use Email For FTP",PREF_BOOL}, {"network.cookie.warnAboutCookies","Network","Warn Accepting Cookie",PREF_BOOL}, #if defined(SingleSignon) {"network.signon.rememberSignons","Network","Remember Signons",PREF_BOOL}, #endif {"network.max_connections","Network","Max Connections",PREF_INT}, {"network.tcpbufsize","Network","TCP Buffer Size",PREF_INT}, // {"news.max_articles","News","News Chunk Size",PREF_INT}, {"news.show_headers","News","Show Headers",PREF_INT}, {"news.sort_by","News","Sort News",PREF_INT}, {"news.thread_news","News","Thread News",PREF_BOOL}, // {"network.proxy.autoconfig_url","Proxy Information","Auto Config Url",PREF_CHAR}, {"network.proxy.type","Proxy Information","Proxy Type",PREF_INT}, {"network.proxy.wais_port","Proxy Information","Wais_ProxyPort",PREF_INT}, {"network.proxy.ftp_port","Proxy Information","Ftp_ProxyPort",PREF_INT}, {"network.proxy.ssl_port","Proxy Information","HTTPS_ProxyPort",PREF_INT}, {"network.proxy.gopher_port","Proxy Information","Gopher_ProxyPort",PREF_INT}, {"network.proxy.http_port","Proxy Information","Http_ProxyPort",PREF_INT}, {"network.proxy.no_proxies_on","Proxy Information","No_Proxy",PREF_CHAR}, {"network.proxy.wais","Proxy Information","Wais_Proxy",PREF_CHAR}, {"network.proxy.ssl","Proxy Information","HTTPS_Proxy",PREF_CHAR}, {"network.proxy.gopher","Proxy Information","Gopher_Proxy",PREF_CHAR}, {"network.proxy.ftp","Proxy Information","FTP_Proxy",PREF_CHAR}, {"network.proxy.http","Proxy Information","HTTP_Proxy",PREF_CHAR}, // {"security.warn_submit_insecure","Security","Warn Insecure Forms",PREF_BOOL}, {"security.default_personal_cert","Security","Default User Cert",PREF_CHAR}, {"security.enable_ssl3","Security","Enable SSL v3",PREF_BOOL}, {"security.enable_ssl2","Security","Enable SSL v2",PREF_BOOL}, {"security.ask_for_password","Security","Ask for password",PREF_INT}, {"security.password_lifetime","Security","Password Lifetime",PREF_INT}, {"security.warn_entering_secure","Security","Warn Entering",PREF_BOOL}, {"security.warn_leaving_secure","Security","Warn Leaving",PREF_BOOL}, {"security.warn_viewing_mixed","Security","Warn Mixed",PREF_BOOL}, {"security.ciphers","Security","Cipher Prefs",PREF_CHAR}, // {"mail.use_exchange","Services","Mapi",PREF_BOOL}, {"network.hosts.socks_serverport","Services","SOCKS_ServerPort",PREF_INT}, {"network.hosts.socks_conf","Services","Socks Conf",PREF_CHAR}, {"network.hosts.pop_server","Services","POP_Server",PREF_CHAR}, {"network.hosts.nntp_server","Services","NNTP_Server",PREF_CHAR}, {"network.hosts.smtp_server","Services","SMTP_Server",PREF_CHAR}, {"network.hosts.socks_server","Services","SOCKS_Server",PREF_CHAR}, // {"mail.fixed_width_messages","Settings","Fixed Width Messages",PREF_BOOL}, {"mail.quoted_style","Settings","Quoted Style",PREF_INT}, {"mail.quoted_size","Settings","Quoted Size",PREF_INT}, {"browser.blink_allowed","Settings","Blinking",PREF_BOOL}, {"browser.link_expiration","Settings","History Expiration",PREF_INT}, // {"mail.identity.reply_to","User","Reply_To",PREF_CHAR}, {"mail.identity.organization","User","User_Organization",PREF_CHAR}, {"mail.signature_file","User","Sig_File",PREF_CHAR}, // {"editor.publish_location", "Publish", "Default Location", PREF_CHAR}, {"editor.publish_browse_location", "Publish", "Default Browse Location", PREF_CHAR}, // {NULL,NULL,NULL,NULL} }; int login_UpdatePreferencesToJavaScript(const char * path) { int idx=0; while (prefUpdater[idx].xp_name) { if (prefUpdater[idx].type == PREF_CHAR) {// char pref CString csPref= theApp.GetProfileString(prefUpdater[idx].section,prefUpdater[idx].name,""); if (!csPref.IsEmpty()) PREF_SetCharPref(prefUpdater[idx].xp_name,(char *)(const char *)csPref); } else if (prefUpdater[idx].type == PREF_INT) {// char pref int iPref= theApp.GetProfileInt(prefUpdater[idx].section,prefUpdater[idx].name,-1); if (iPref != -1) PREF_SetIntPref(prefUpdater[idx].xp_name,iPref); } else if (prefUpdater[idx].type == PREF_BOOL) {// char pref CString csPref= theApp.GetProfileString(prefUpdater[idx].section,prefUpdater[idx].name,""); if (!csPref.IsEmpty()) { int iRet = csPref.CompareNoCase("yes"); if (iRet ==0) PREF_SetBoolPref(prefUpdater[idx].xp_name,TRUE); else PREF_SetBoolPref(prefUpdater[idx].xp_name,FALSE); } } idx++; } // Do some special hacking on "browser.cache.check_doc_frequency" since the values changed // between 3.0 and 4.0 int32 iExpr; PREF_GetIntPref("browser.cache.check_doc_frequency",&iExpr); if (iExpr == 1) PREF_SetIntPref("browser.cache.check_doc_frequency",0); else if (iExpr == 0) PREF_SetIntPref("browser.cache.check_doc_frequency",1); // Do some special processing for history link expiration. It used to be that there // was an option that history never expired. We no longer support that, in the UI // anyway int32 iExp; PREF_GetIntPref("browser.link_expiration", &iExp); if (iExp == -1) { // Set the date to something safe like 6 months PREF_SetIntPref("browser.link_expiration", 180); } CString csPref= theApp.GetProfileString("Main","Autoload Home Page",""); if (!csPref.IsEmpty()) { if (!csPref.CompareNoCase("yes")) PREF_SetIntPref("browser.startup.page", 1); // set to load homepage else PREF_SetIntPref("browser.startup.page", 0); // set to blank } return TRUE; } void login_CreateEmptyProfileDir(const char * dst, CWnd * pParent, BOOL bExistingDir) { CString csTmp; csTmp = dst; csTmp += "\\News"; _mkdir(csTmp); csTmp = dst; csTmp += "\\Mail"; _mkdir(csTmp); csTmp = dst; csTmp += "\\Cache"; _mkdir(csTmp); csTmp = dst; csTmp += "\\NavCntr"; _mkdir(csTmp); if (!bExistingDir) login_CopyStarterFiles(dst,pParent); } /* The following has to be declared extern "C" because it's called from some Java native code written in C. */ extern "C" char * login_GetUserProfileDir() { char *pString = NULL; /* First, get the user's profile name */ char *name = login_GetCurrentUser(); #ifdef XP_WIN32 char path[MAX_PATH+1]; long result; DWORD type, size; HKEY hKeyRet; /* get profile path */ strcpy(path, "SOFTWARE\\Netscape\\Netscape Navigator\\Users"); strcat(path, "\\"); strcat(path, name); if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, path, &hKeyRet)) { // see how much space we need size = 0; result = RegQueryValueEx(hKeyRet, "DirRoot", NULL, &type, NULL, &size); // if we didn't find it just use the default if((result == ERROR_SUCCESS) && (size != 0)) { // allocate space to hold the string pString = (char *) XP_ALLOC(size * sizeof(char)); // actually load the string now that we have the space result = RegQueryValueEx(hKeyRet, "DirRoot", NULL, &type, (LPBYTE) pString, &size); if (hKeyRet) RegCloseKey(hKeyRet); } } #else CString csNSCPini; login_GetIniFilePath(csNSCPini); pString = (char *) XP_ALLOC(_MAX_PATH * sizeof(char)); ::GetPrivateProfileString("Users", name,"",pString,_MAX_PATH,csNSCPini); #endif XP_FREE(name); // The string has to be freed by the caller return pString; } void login_CopyStarterFiles(const char * dst, CWnd *pParent) { CString csDst = dst; CString csSrc; char aPath[_MAX_PATH]; CUpdateFileDlg * pDlg = new CUpdateFileDlg(pParent,TRUE); ::GetModuleFileName(theApp.m_hInstance, aPath, _MAX_PATH); // Find the trailing slash. char *pSlash = ::strrchr(aPath, '\\'); if(pSlash) { *pSlash = '\0'; } else { aPath[0] = '\0'; } if (!(aPath && aPath[0])) return; if (!dst) return; if (!pDlg) return; csSrc = aPath; csSrc += "\\defaults"; csDst = dst; WFEU_UpdaterCopyDirectory(csSrc,csDst,pDlg,"Default Files"); // PE doesn't have a parent window to attach pDlg to. if (!pParent) // For now, this will be PE specific. JonM will decide if it's always... delete pDlg; } int login_UpdateFilesToNewLocation(const char * path,CWnd *pParent,BOOL bCopyDontMove) { CString csTmp; if (!path) return FALSE; CUpdateFileDlg * pDlg = new CUpdateFileDlg(pParent,bCopyDontMove); CString csMain = theApp.GetProfileString("Main","Install Directory",""); CString csBookmarks = theApp.GetProfileString("Bookmark List","File Location",""); if (!csBookmarks.IsEmpty()) { csTmp = path; csTmp += "\\bookmark.htm"; pDlg->StartFileUpdate("General Files","bookmark.htm"); if (bCopyDontMove) { WFE_CopyFile(csBookmarks,csTmp); } else { if (WFE_MoveFile(csBookmarks,csTmp)) theApp.WriteProfileString("Bookmark List","File Location",csTmp); } } CString csABook = theApp.GetProfileString("Address Book","File Location",""); if (!csABook.IsEmpty()) { csTmp = path; csTmp += "\\address.htm"; pDlg->StartFileUpdate("General Files","address.htm"); if (bCopyDontMove) { WFE_CopyFile(csABook,csTmp); } else { if (WFE_MoveFile(csABook,csTmp)) theApp.WriteProfileString("Address Book","File Location",csTmp); } } else { if (!csMain.IsEmpty()) { csTmp = path; csTmp += "\\address.htm"; pDlg->StartFileUpdate("General Files","address.htm"); WFE_CopyFile(csMain + "\\address.htm" ,csTmp); } } CString csHist = theApp.GetProfileString("History","History File",""); CString csFilename = CString(XP_AppName) + ".hst"; if (!csHist.IsEmpty()) { csTmp = path; csTmp += CString("\\") + csFilename; pDlg->StartFileUpdate("General Files", (char*)(const char*)csFilename); if (bCopyDontMove) { WFE_CopyFile(csHist,csTmp); } else { if (WFE_MoveFile(csHist,csTmp)) theApp.WriteProfileString("History","History File",csTmp); } } else { if (!csMain.IsEmpty()) { csTmp = path; csTmp += CString("\\") + csFilename; pDlg->StartFileUpdate("General Files",(char*)(const char*)csFilename); WFE_CopyFile(csMain + "\\mozilla.hst" ,csTmp); } } CString csNewsRC = theApp.GetProfileString("Main","News RC",""); if (!csNewsRC.IsEmpty()) { csTmp = path; csTmp += "\\Newsrc"; pDlg->StartFileUpdate("General Files","Newsrc"); if (bCopyDontMove) { WFE_CopyFile(csNewsRC,csTmp); } else { if (WFE_MoveFile(csNewsRC,csTmp)) theApp.WriteProfileString("Main","News RC",csTmp); } } if (!csMain.IsEmpty()) { // these files are always copied since we don't store pointers csTmp = path; csTmp += "\\socks.cnf"; pDlg->StartFileUpdate("General Files","socks.cnf"); WFE_CopyFile(csMain + "\\socks.cnf" ,csTmp); csTmp = path; csTmp += "\\cookies.txt"; pDlg->StartFileUpdate("General Files","cookies.txt"); WFE_CopyFile(csMain + "\\cookies.txt",csTmp); #if defined(CookieManagement) csTmp = path; csTmp += "\\cookperm.txt"; pDlg->StartFileUpdate("General Files","cookperm.txt"); WFE_CopyFile(csMain + "\\cookperm.txt",csTmp); #endif #if defined(SingleSignon) csTmp = path; csTmp += "\\signons.txt"; pDlg->StartFileUpdate("General Files","signons.txt"); WFE_CopyFile(csMain + "\\signons.txt",csTmp); #endif csTmp = path; csTmp += "\\key.db"; pDlg->StartFileUpdate("Security Files","key.db"); WFE_CopyFile(csMain + "\\key.db",csTmp); csTmp = path; csTmp += "\\cert5.db"; pDlg->StartFileUpdate("Security Files","cert5.db"); WFE_CopyFile(csMain + "\\cert5.db",csTmp); csTmp = path; csTmp += "\\certni.db"; pDlg->StartFileUpdate("Security Files","certni.db"); WFE_CopyFile(csMain + "\\certni.db",csTmp); csTmp = path; csTmp += "\\proxy.cfg"; pDlg->StartFileUpdate("Network Files","proxy.cfg"); WFE_CopyFile(csMain + "\\proxy.cfg",csTmp); csTmp = path; csTmp += "\\abook.nab"; if (bCopyDontMove) WFE_CopyFile(csMain + "\\abook.nab",csTmp); else WFE_MoveFile(csMain + "\\abook.nab",csTmp); } csTmp = path; csTmp += "\\Mail"; CString csMail = theApp.GetProfileString("Mail","Mail Directory",""); if (!strnicmp(csMail,csTmp,strlen(csMail))) { char szMsg[256]; _snprintf(szMsg, 256, szLoadString(IDS_UNABLETRANSFER_SUBDIR),"Mail Directory"); AfxMessageBox(szMsg); } else { if (bCopyDontMove) { if (!csMail.IsEmpty()) { WFEU_UpdaterCopyDirectory(csMail,csTmp,pDlg,"Mail Directory"); } } else { if ((!csMail.IsEmpty()) && WFEU_UpdaterMoveDirectory(csMail,csTmp,pDlg,"Mail Directory")) { theApp.WriteProfileString("Mail","Mail Directory",csTmp); CString csFCC = theApp.GetProfileString("Mail","Default Fcc",""); int iSlash = csFCC.ReverseFind('\\'); if (iSlash != -1) { CString csFolder = csFCC.Right(csFCC.GetLength()-iSlash); theApp.WriteProfileString("Mail","Default Fcc",csTmp+csFolder); } } } } csTmp = path; csTmp += "\\News"; CString csNews = theApp.GetProfileString("News","News Directory",""); if (!strnicmp(csNews,csTmp,strlen(csNews))) { char szMsg[256]; _snprintf(szMsg, 256, szLoadString(IDS_UNABLETRANSFER_SUBDIR),"News Directory"); AfxMessageBox(szMsg); } else { if (bCopyDontMove) { if (!csNews.IsEmpty()) { WFEU_UpdaterCopyDirectory(csNews,csTmp,pDlg,"News Directory"); } } else { if ((!csNews.IsEmpty()) && WFEU_UpdaterMoveDirectory(csNews,csTmp,pDlg,"News Directory")) theApp.WriteProfileString("News","News Directory",csTmp); } // update news rc file either way to new directory -- creates fat,new int iRet = WFEU_UpdateNewsFatFile(csTmp,csTmp); // now move fat.new over the old fat file if (iRet) { CString csOldFat = csTmp + "\\fat"; CString csNewFat = csTmp + "\\fat.new"; rename(csOldFat,csTmp + "\\fat.old"); rename(csNewFat,csTmp + "\\fat"); } } csTmp = path; csTmp += "\\cache"; CString csCache = theApp.GetProfileString("Cache","Cache Dir",""); if (!strnicmp(csCache,csTmp,strlen(csCache))) { char szMsg[256]; _snprintf(szMsg, 256, szLoadString(IDS_UNABLETRANSFER_SUBDIR),"Cache Directory"); AfxMessageBox(szMsg); } else { if (bCopyDontMove) { if (!csCache.IsEmpty()) { WFEU_UpdaterCopyDirectory(csCache,csTmp,pDlg,"Cache Directory"); } } else { if ((!csCache.IsEmpty()) && WFEU_UpdaterMoveDirectory(csCache,csTmp,pDlg,"Cache Directory")) theApp.WriteProfileString("Cache","Cache Dir",csTmp); } } return TRUE; } // CUpdateFileDlg dialog CUpdateFileDlg::CUpdateFileDlg(CWnd *pParent, BOOL bCopyDontMove) : CDialog(CUpdateFileDlg::IDD, pParent), m_pParent(pParent) { //{{AFX_DATA_INIT(CSaveFileDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Suppress user interaction while we are active! if(pParent){ pParent->EnableWindow(FALSE); } // For simplicity, create right here if (!CDialog::Create(CUpdateFileDlg::IDD, pParent)) { TRACE0("Warning: creation of CUpdateFileDlg dialog failed\n"); return; } m_bCopyDontMove = bCopyDontMove; // Clear our place-holder string GetDlgItem(IDC_CATEGORY)->SetWindowText(""); GetDlgItem(IDC_TEXT1)->SetWindowText("Note: If you have large mail or news folders, some of these operations may take a while. Please be patient."); // Why doesn't this center on parent window automatically! CRect cRectParent; CRect cRectDlg; if( pParent ){ pParent->GetWindowRect(&cRectParent); GetWindowRect(&cRectDlg); int iTop = 200; int iLeft = 200; if ( cRectParent.Height() > cRectDlg.Height() ){ iTop = cRectParent.top + ( (cRectParent.Height() - cRectDlg.Height()) / 2 ); } if ( cRectParent.Width() > cRectDlg.Width() ){ iLeft = cRectParent.left + ( (cRectParent.Width() - cRectDlg.Width()) / 2 ); } SetWindowPos(&wndTopMost, iLeft, iTop, 0, 0, SWP_NOSIZE); } ShowWindow(SW_SHOW); } void CUpdateFileDlg::StartFileUpdate(char *category,char * pFilename) { GetDlgItem(IDC_CATEGORY)->SetWindowText(category); CString csTmp; if (m_bCopyDontMove) csTmp = "Copying File: "; else csTmp = "Moving File: "; csTmp+=pFilename; GetDlgItem(IDC_FILENAME_AREA)->SetWindowText(csTmp); // Report file number if we have more than 1 total } void CUpdateFileDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSaveFileDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CUpdateFileDlg, CDialog) //{{AFX_MSG_MAP(CSaveFileDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CUpdateFileDlg::PostNcDestroy() { CDialog::PostNcDestroy(); if( m_pParent && ::IsWindow(m_pParent->m_hWnd) ){ m_pParent->EnableWindow(TRUE); // Return focus to parent window m_pParent->SetActiveWindow(); m_pParent->SetFocus(); } } #ifdef XP_WIN16 void login_GetIniFilePath(CString &csNSCPini) { // give a chance for win.ini to override the nscp.ini location auto char ca_iniBuff[_MAX_PATH]; ::GetProfileString("netscape", "nscpINI", "", ca_iniBuff, _MAX_PATH); if (ca_iniBuff[0]) { csNSCPini = ca_iniBuff; return; } // otherwise fallback on the default GetWindowsDirectory(ca_iniBuff, _MAX_PATH); if (ca_iniBuff[strlen(ca_iniBuff)-1] == '\\') ca_iniBuff[strlen(ca_iniBuff)-1] = 0; csNSCPini = ca_iniBuff; csNSCPini += "\\nscp.ini"; } #endif