NS_IMETHODIMP nsAbManager::GetDirectory(const nsACString &aURI, nsIAbDirectory **aResult) { NS_ENSURE_ARG_POINTER(aResult); nsresult rv; nsCOMPtr<nsIAbDirectory> directory; // Was the directory root requested? if (aURI.EqualsLiteral(kAllDirectoryRoot)) { rv = GetRootDirectory(getter_AddRefs(directory)); NS_ENSURE_SUCCESS(rv, rv); NS_IF_ADDREF(*aResult = directory); return NS_OK; } // Do we have a copy of this directory already within our look-up table? if (!mAbStore.Get(aURI, getter_AddRefs(directory))) { // The directory wasn't in our look-up table, so we need to instantiate // it. First, extract the scheme from the URI... nsCAutoString scheme; PRInt32 colon = aURI.FindChar(':'); if (colon <= 0) return NS_ERROR_MALFORMED_URI; scheme = Substring(aURI, 0, colon); // Construct the appropriate nsIAbDirectory... nsCAutoString contractID; contractID.AssignLiteral(NS_AB_DIRECTORY_TYPE_CONTRACTID_PREFIX); contractID.Append(scheme); directory = do_CreateInstance(contractID.get(), &rv); NS_ENSURE_SUCCESS(rv, rv); // Init it with the URI rv = directory->Init(PromiseFlatCString(aURI).get()); NS_ENSURE_SUCCESS(rv, rv); // Check if this directory was initiated with a search query. If so, // we don't cache it. bool isQuery = false; rv = directory->GetIsQuery(&isQuery); NS_ENSURE_SUCCESS(rv, rv); if (!isQuery) mAbStore.Put(aURI, directory); } NS_IF_ADDREF(*aResult = directory); return NS_OK; }
NS_IMETHODIMP nsAbManager::NewAddressBook(const nsAString &aDirName, const nsACString &aURI, const PRUint32 aType, const nsACString &aPrefName, nsACString &aResult) { nsresult rv; nsCOMPtr<nsIAbDirectory> parentDir; rv = GetRootDirectory(getter_AddRefs(parentDir)); NS_ENSURE_SUCCESS(rv, rv); return parentDir->CreateNewDirectory(aDirName, aURI, aType, aPrefName, aResult); }
NS_IMETHODIMP nsAbManager::GetDirectories(nsISimpleEnumerator **aResult) { NS_ENSURE_ARG_POINTER(aResult); // We cache the top level AB to ensure that nsIAbDirectory items are not // created and dumped every time GetDirectories is called. This was causing // performance problems, especially with the content policy on messages // with lots of urls. nsresult rv; nsCOMPtr<nsIAbDirectory> rootAddressBook; rv = GetRootDirectory(getter_AddRefs(rootAddressBook)); NS_ENSURE_SUCCESS(rv, rv); return rootAddressBook->GetChildNodes(aResult); }
// GetEntry Entry* ClientVolume::GetEntry(dev_t volumeID, ino_t dirID, const char* name) { VolumeManager* volumeManager = VolumeManager::GetDefault(); // get the entry Entry* entry = volumeManager->GetEntry(volumeID, dirID, name); if (!entry) return NULL; // check, if the entry is contained by the root dir of the client volume if (volumeManager->DirectoryContains(GetRootDirectory(), entry)) return entry; return NULL; }
// GetDirectory Directory* ClientVolume::GetDirectory(dev_t volumeID, ino_t nodeID) { VolumeManager* volumeManager = VolumeManager::GetDefault(); // get the directory Directory* dir = GetDirectory(volumeID, nodeID); if (!dir) return NULL; // check, if the dir is contained by the root dir of the client volume if (volumeManager->DirectoryContains(GetRootDirectory(), dir, true)) return dir; return NULL; }
// GetNode Node* ClientVolume::GetNode(dev_t volumeID, ino_t nodeID) { VolumeManager* volumeManager = VolumeManager::GetDefault(); // get the node Node* node = volumeManager->GetNode(volumeID, nodeID); if (!node) return NULL; // check, if the node is contained by the root dir of the client volume if (volumeManager->DirectoryContains(GetRootDirectory(), node, true)) return node; return NULL; }
NS_IMETHODIMP nsAbManager::MailListNameExists(const PRUnichar *name, bool *exist) { nsresult rv; NS_ENSURE_ARG_POINTER(exist); *exist = PR_FALSE; // now get the top-level book nsCOMPtr<nsIAbDirectory> topDirectory; rv = GetRootDirectory(getter_AddRefs(topDirectory)); // now go through the address books nsCOMPtr<nsISimpleEnumerator> enumerator; rv = topDirectory->GetChildNodes(getter_AddRefs(enumerator)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsISupports> item; nsCOMPtr<nsIAbMDBDirectory> directory; bool hasMore; // XXX Make this not MDB specific. while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) { rv = enumerator->GetNext(getter_AddRefs(item)); NS_ENSURE_SUCCESS(rv, rv); directory = do_QueryInterface(item, &rv); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIAddrDatabase> database; rv = directory->GetDatabase(getter_AddRefs(database)); if (NS_SUCCEEDED(rv)) { rv = database->FindMailListbyUnicodeName(name, exist); if (NS_SUCCEEDED(rv) && *exist) return NS_OK; } } } return NS_OK; }
// LoadDirectory status_t ClientVolume::LoadDirectory(dev_t volumeID, ino_t nodeID, Directory** _directory) { if (!_directory) return B_BAD_VALUE; VolumeManager* volumeManager = VolumeManager::GetDefault(); // load the directory Directory* dir; status_t error = volumeManager->LoadDirectory(volumeID, nodeID, &dir); if (error != B_OK) return error; // check, if the dir is contained by the root dir of the client volume if (!volumeManager->DirectoryContains(GetRootDirectory(), dir, true)) return B_ENTRY_NOT_FOUND; *_directory = dir; return B_OK; }
// LoadEntry status_t ClientVolume::LoadEntry(dev_t volumeID, ino_t dirID, const char* name, Entry** _entry) { if (!name || !_entry) return B_BAD_VALUE; VolumeManager* volumeManager = VolumeManager::GetDefault(); // get the entry Entry* entry; status_t error = VolumeManager::GetDefault()->LoadEntry(volumeID, dirID, name, true, &entry); if (error != B_OK) return error; // check, if the entry is contained by the root dir of the client volume if (!volumeManager->DirectoryContains(GetRootDirectory(), entry)) return B_ENTRY_NOT_FOUND; *_entry = entry; return B_OK; }
bool CBOINCGUIApp::OnInit() { // Initialize globals #ifdef SANDBOX g_use_sandbox = true; #else g_use_sandbox = false; #endif s_bSkipExitConfirmation = false; m_bFilterEvents = false; m_bAboutDialogIsOpen = false; // Initialize class variables m_pLocale = NULL; m_pSkinManager = NULL; m_pFrame = NULL; m_pDocument = NULL; m_pTaskBarIcon = NULL; m_pEventLog = NULL; #ifdef __WXMAC__ m_pMacDockIcon = NULL; #endif m_strBOINCMGRExecutableName = wxEmptyString; m_strBOINCMGRRootDirectory = wxEmptyString; m_strBOINCMGRDataDirectory = wxEmptyString; m_strHostNameArg = wxEmptyString; m_strPasswordArg = wxEmptyString; m_iRPCPortArg = GUI_RPC_PORT; m_strBOINCArguments = wxEmptyString; m_bGUIVisible = true; m_bDebugSkins = false; m_bMultipleInstancesOK = false; m_bBOINCMGRAutoStarted = false; m_iBOINCMGRDisableAutoStart = 0; m_iShutdownCoreClient = 0; m_iDisplayExitDialog = 1; m_iGUISelected = BOINC_SIMPLEGUI; m_bSafeMessageBoxDisplayed = 0; #ifdef __WXMSW__ m_hClientLibraryDll = NULL; #endif // Initialize local variables int iErrorCode = 0; int iSelectedLanguage = 0; bool bOpenEventLog = false; wxString strDesiredSkinName = wxEmptyString; wxString strDialogMessage = wxEmptyString; bool success = false; // Configure wxWidgets platform specific code #ifdef __WXMSW__ wxSystemOptions::SetOption(wxT("msw.staticbox.optimized-paint"), 0); #endif #ifdef __WXMAC__ // In wxMac-2.8.7, default wxListCtrl::RefreshItem() does not work // so use traditional generic implementation. // This has been fixed in wxMac-2.8.8, but the Mac native implementation: // - takes 3 times the CPU time as the Mac generic version. // - seems to always redraw entire control even if asked to refresh only one row. // - causes major flicker of progress bars, (probably due to full redraws.) wxSystemOptions::SetOption(wxT("mac.listctrl.always_use_generic"), 1); AEInstallEventHandler( kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP((AEEventHandlerProcPtr)QuitAppleEventHandler), 0, false ); // Cache the current process serial number GetCurrentProcess(&m_psnCurrentProcess); #endif // Commandline parsing is done in wxApp::OnInit() if (!wxApp::OnInit()) { return false; } if (g_use_sandbox) { wxCHANGE_UMASK(2); // Set file creation mask to be writable by both user and group // Our umask will be inherited by all our child processes } // Setup application and company information SetAppName(wxT("BOINC Manager")); SetVendorName(wxT("Space Sciences Laboratory, U.C. Berkeley")); // Initialize the configuration storage module m_pConfig = new wxConfig(GetAppName()); wxConfigBase::Set(m_pConfig); wxASSERT(m_pConfig); // Restore Application State m_pConfig->SetPath(wxT("/")); m_pConfig->Read(wxT("AutomaticallyShutdownClient"), &m_iShutdownCoreClient, 0L); m_pConfig->Read(wxT("DisplayShutdownClientDialog"), &m_iDisplayExitDialog, 1L); m_pConfig->Read(wxT("DisableAutoStart"), &m_iBOINCMGRDisableAutoStart, 0L); m_pConfig->Read(wxT("Language"), &iSelectedLanguage, 0L); m_pConfig->Read(wxT("GUISelection"), &m_iGUISelected, BOINC_SIMPLEGUI); m_pConfig->Read(wxT("EventLogOpen"), &bOpenEventLog); // Should we abort the BOINC Manager startup process? if (m_bBOINCMGRAutoStarted && m_iBOINCMGRDisableAutoStart) { return false; } // Detect where BOINC Manager executable name. DetectExecutableName(); // Detect where BOINC Manager was installed too. DetectRootDirectory(); // Detect where the BOINC Data files are. DetectDataDirectory(); // Switch the current directory to the BOINC Data directory if (!GetDataDirectory().IsEmpty()) { success = wxSetWorkingDirectory(GetDataDirectory()); if (!success) { if (!g_use_sandbox) { if (!wxDirExists(GetDataDirectory())) { success = wxMkdir(GetDataDirectory(), 0777); // Does nothing if dir exists } } } } if (!success) iErrorCode = -1016; // Initialize the BOINC Diagnostics Framework int dwDiagnosticsFlags = BOINC_DIAG_DUMPCALLSTACKENABLED | BOINC_DIAG_HEAPCHECKENABLED | BOINC_DIAG_MEMORYLEAKCHECKENABLED | #if defined(__WXMSW__) || defined(__WXMAC__) BOINC_DIAG_REDIRECTSTDERR | BOINC_DIAG_REDIRECTSTDOUT | #endif BOINC_DIAG_TRACETOSTDOUT; diagnostics_init( dwDiagnosticsFlags, "stdoutgui", "stderrgui" ); // Enable Logging and Trace Masks m_pLog = new wxLogBOINC(); wxLog::SetActiveTarget(m_pLog); m_pLog->AddTraceMask(wxT("Function Start/End")); m_pLog->AddTraceMask(wxT("Function Status")); // Initialize the internationalization module #ifdef __WXMSW__ // On Windows, set all locales for this thread on a per-thread basis _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); #endif m_pLocale = new wxLocale(); wxASSERT(m_pLocale); // Look for the localization files by absolute and relative locations. // preference given to the absolute location. m_pLocale->Init(iSelectedLanguage); if (!m_strBOINCMGRRootDirectory.IsEmpty()) { m_pLocale->AddCatalogLookupPathPrefix( wxString(m_strBOINCMGRRootDirectory + wxT("locale")) ); } m_pLocale->AddCatalogLookupPathPrefix(wxT("locale")); m_pLocale->AddCatalog(wxT("BOINC-Manager")); m_pLocale->AddCatalog(wxT("BOINC-Client")); m_pLocale->AddCatalog(wxT("BOINC-Web")); InitSupportedLanguages(); language = m_pLocale->GetCanonicalName(); // Note: JAWS for Windows will only speak the context-sensitive // help if you use this help provider: wxHelpProvider::Set(new wxHelpControllerHelpProvider()); // Enable known image types wxInitAllImageHandlers(); // Initialize the skin manager m_pSkinManager = new CSkinManager(m_bDebugSkins); wxASSERT(m_pSkinManager); // Load desired manager skin m_pConfig->Read(wxT("Skin"), &strDesiredSkinName, m_pSkinManager->GetDefaultSkinName()); m_pSkinManager->ReloadSkin(strDesiredSkinName); #ifdef SANDBOX // Make sure owners, groups and permissions are correct for the current setting of g_use_sandbox char path_to_error[MAXPATHLEN]; path_to_error[0] = '\0'; if (!iErrorCode) { #if (defined(__WXMAC__) && defined(_DEBUG)) // TODO: implement this for other platforms // GDB can't attach to applications which are running as a different user // or group, so fix up data with current user and group during debugging if (check_security(g_use_sandbox, true, NULL, 0)) { CreateBOINCUsersAndGroups(); SetBOINCDataOwnersGroupsAndPermissions(); SetBOINCAppOwnersGroupsAndPermissions(NULL); } #endif iErrorCode = check_security( g_use_sandbox, true, path_to_error, sizeof(path_to_error) ); } if (iErrorCode) { ShowApplication(true); if (iErrorCode == -1099) { strDialogMessage.Printf( _("You currently are not authorized to manage the client.\n\nTo run %s as this user, please:\n - reinstall %s answering \"Yes\" to the question about\n non-administrative users\n or\n - contact your administrator to add you to the 'boinc_master'\n user group."), m_pSkinManager->GetAdvanced()->GetApplicationShortName().c_str(), m_pSkinManager->GetAdvanced()->GetApplicationShortName().c_str() ); } else { strDialogMessage.Printf( _("%s ownership or permissions are not set properly; please reinstall %s.\n(Error code %d"), m_pSkinManager->GetAdvanced()->GetApplicationShortName().c_str(), m_pSkinManager->GetAdvanced()->GetApplicationShortName().c_str(), iErrorCode ); if (path_to_error[0]) { strDialogMessage += _(" at "); strDialogMessage += wxString::FromUTF8(path_to_error); } strDialogMessage += _(")"); fprintf(stderr, "%s\n", (const char*)strDialogMessage.utf8_str()); } wxMessageDialog* pDlg = new wxMessageDialog( NULL, strDialogMessage, m_pSkinManager->GetAdvanced()->GetApplicationName(), wxOK ); pDlg->ShowModal(); if (pDlg) pDlg->Destroy(); return false; } #endif // SANDBOX #ifdef __WXMSW__ // Perform any last minute checks that should keep the manager // from starting up. wxString strRebootPendingFile = GetRootDirectory() + wxFileName::GetPathSeparator() + wxT("RebootPending.txt"); if (wxFile::Exists(strRebootPendingFile)) { wxMessageDialog dialog( NULL, _("A reboot is required in order for BOINC to run properly.\nPlease reboot your computer and try again."), _("BOINC Manager"), wxOK|wxICON_ERROR ); dialog.ShowModal(); return false; } #endif // Detect if BOINC Manager is already running, if so, bring it into the // foreground and then exit. if (!m_bMultipleInstancesOK) { if (DetectDuplicateInstance()) { return false; } } // Initialize the main document m_pDocument = new CMainDocument(); wxASSERT(m_pDocument); m_pDocument->OnInit(); // Is there a condition in which the Simple GUI should not be used? if (BOINC_SIMPLEGUI == m_iGUISelected) { // Screen too small? if (wxGetDisplaySize().GetHeight() < 600) { m_iGUISelected = BOINC_ADVANCEDGUI; } } // Initialize the task bar icon m_pTaskBarIcon = new CTaskBarIcon( m_pSkinManager->GetAdvanced()->GetApplicationName(), m_pSkinManager->GetAdvanced()->GetApplicationIcon(), m_pSkinManager->GetAdvanced()->GetApplicationDisconnectedIcon(), m_pSkinManager->GetAdvanced()->GetApplicationSnoozeIcon() #ifdef __WXMAC__ , wxTBI_CUSTOM_STATUSITEM #endif ); #ifdef __WXMAC__ m_pMacDockIcon = new CTaskBarIcon( m_pSkinManager->GetAdvanced()->GetApplicationName(), m_pSkinManager->GetAdvanced()->GetApplicationIcon(), m_pSkinManager->GetAdvanced()->GetApplicationDisconnectedIcon(), m_pSkinManager->GetAdvanced()->GetApplicationSnoozeIcon() , wxTBI_DOCK ); wxASSERT(m_pMacDockIcon); #endif wxASSERT(m_pTaskBarIcon); // Startup the System Idle Detection code IdleTrackerAttach(); #ifdef __WXMAC__ ProcessSerialNumber psn; ProcessInfoRec pInfo; OSStatus err; memset(&pInfo, 0, sizeof(pInfo)); pInfo.processInfoLength = sizeof( ProcessInfoRec ); err = GetProcessInformation(&m_psnCurrentProcess, &pInfo); if (!err) { psn = pInfo.processLauncher; memset(&pInfo, 0, sizeof(pInfo)); pInfo.processInfoLength = sizeof( ProcessInfoRec ); err = GetProcessInformation(&psn, &pInfo); } // Don't open main window if we were started automatically at login if (pInfo.processSignature == 'lgnw') { // Login Window app m_bGUIVisible = false; // If the system was just started, we usually get a "Connection // failed" error if we try to connect too soon, so delay a bit. sleep(10); } #endif // Show the UI SetActiveGUI(m_iGUISelected, m_bGUIVisible); if (!m_bGUIVisible) { #ifdef __WXMAC__ // We don't call Hide() or Show(false) for the main frame // under wxCocoa 2.9.5 because it bounces the Dock icon // (as in notification.) We work around this by moving // the main window/frame off screen here. // The position will be restored in one of these methods: // CBOINCGUIApp::OnActivateApp(), CSimpleFrame::SaveState() // or CAdvancedFrame::SaveWindowDimensions(). if (m_pFrame) { m_pFrame->MoveFrameOffScreen(); m_pFrame->Show(); } #endif ShowApplication(false); } if (bOpenEventLog) { DisplayEventLog(m_bGUIVisible); if (m_bGUIVisible && m_pFrame) { m_pFrame->Raise(); } } return true; }
NS_IMETHODIMP nsAbManager::DeleteAddressBook(const nsACString &aURI) { // Find the address book nsresult rv; nsCOMPtr<nsIAbDirectory> directory; rv = GetDirectory(aURI, getter_AddRefs(directory)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIAbDirectory> rootDirectory; rv = GetRootDirectory(getter_AddRefs(rootDirectory)); NS_ENSURE_SUCCESS(rv, rv); // Go through each of the children of the address book // (so, the mailing lists) and remove their entries from // the look up table. nsCOMPtr<nsISimpleEnumerator> enumerator; rv = directory->GetChildNodes(getter_AddRefs(enumerator)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsISupports> item; nsCOMPtr<nsIAbDirectory> childDirectory; bool hasMore = false; while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) { rv = enumerator->GetNext(getter_AddRefs(item)); NS_ENSURE_SUCCESS(rv, rv); childDirectory = do_QueryInterface(item, &rv); if (NS_SUCCEEDED(rv)) { nsCString childURI; rv = childDirectory->GetURI(childURI); NS_ENSURE_SUCCESS(rv, rv); mAbStore.Remove(childURI); } } mAbStore.Remove(aURI); bool isMailList; rv = directory->GetIsMailList(&isMailList); NS_ENSURE_SUCCESS(rv, rv); if (!isMailList) // If we're not a mailing list, then our parent // must be the root address book directory. return rootDirectory->DeleteDirectory(directory); nsCString parentUri; parentUri.Append(aURI); PRInt32 pos = parentUri.RFindChar('/'); // If we didn't find a /, we're in trouble. if (pos == -1) return NS_ERROR_FAILURE; parentUri = StringHead(parentUri, pos); nsCOMPtr<nsIAbDirectory> parentDirectory; rv = GetDirectory(parentUri, getter_AddRefs(parentDirectory)); NS_ENSURE_SUCCESS(rv, rv); return parentDirectory->DeleteDirectory(directory); }