/* initialization happens here - object is constructed, but possibly partially shut down */ nsresult nsMsgRDFDataSource::Init() { NS_ENSURE_TRUE(!mInitialized, NS_ERROR_ALREADY_INITIALIZED); nsresult rv; /* Add an observer to XPCOM shutdown */ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); NS_ENSURE_TRUE(obs, NS_ERROR_UNEXPECTED); rv = obs->AddObserver(static_cast<nsIObserver*>(this), NS_XPCOM_SHUTDOWN_OBSERVER_ID, true); NS_ENSURE_SUCCESS(rv, rv); getRDFService(); mInitialized=true; return rv; }
// end of all arcs coming out of msgaccounts:/ nsresult nsMsgAccountManagerDataSource::createRootResources(nsIRDFResource *property, nsISupportsArray* aNodeArray) { nsresult rv = NS_OK; if (isContainment(property)) { nsCOMPtr<nsIMsgAccountManager> am = do_QueryReferent(mAccountManager); if (!am) return NS_ERROR_FAILURE; nsCOMPtr<nsISupportsArray> servers; rv = am->GetAllServers(getter_AddRefs(servers)); if (NS_FAILED(rv)) return rv; // fill up the nodes array with the RDF Resources for the servers serverCreationParams params = { aNodeArray, getRDFService() }; servers->EnumerateForwards(createServerResources, (void*)¶ms); #ifdef DEBUG_amds PRUint32 nodecount; aNodeArray->Count(&nodecount); printf("GetTargets(): added %d servers on %s\n", nodecount, (const char*)property_arc); #endif // for the "settings" arc, we also want to add SMTP setting and the fake account (if required) if (property == kNC_Settings) { aNodeArray->AppendElement(kNC_PageTitleSMTP); if (IsFakeAccountRequired()) aNodeArray->AppendElement(kNC_PageTitleFakeAccount); } else if (property == kNC_Child && IsFakeAccountRequired()) { aNodeArray->AppendElement(kNC_PageTitleFakeAccount); } } #ifdef DEBUG_amds else { printf("unknown arc %s on msgaccounts:/\n", (const char*)property_arc); } #endif return rv; }
nsresult nsMsgAccountManagerDataSource::appendGenericSetting(const char *name, nsISupportsArray *aNodeArray) { NS_ENSURE_ARG_POINTER(name); NS_ENSURE_ARG_POINTER(aNodeArray); nsCOMPtr <nsIRDFResource> resource; nsCAutoString resourceStr; resourceStr = NC_RDF_PAGETITLE_PREFIX; resourceStr += name; nsresult rv = getRDFService()->GetResource(resourceStr, getter_AddRefs(resource)); NS_ENSURE_SUCCESS(rv,rv); // AppendElement will addref. aNodeArray->AppendElement(resource); return NS_OK; }
/* nsIRDFNode GetTarget (in nsIRDFResource aSource, in nsIRDFResource property, in boolean aTruthValue); */ NS_IMETHODIMP nsMsgAccountManagerDataSource::GetTarget(nsIRDFResource *source, nsIRDFResource *property, PRBool aTruthValue, nsIRDFNode **target) { nsresult rv; rv = NS_RDF_NO_VALUE; nsAutoString str; if (property == kNC_Name || property == kNC_FolderTreeName || property == kNC_FolderTreeSimpleName) { rv = getStringBundle(); NS_ENSURE_SUCCESS(rv, rv); nsXPIDLString pageTitle; if (source == kNC_PageTitleServer) mStringBundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-server").get(), getter_Copies(pageTitle)); else if (source == kNC_PageTitleCopies) mStringBundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-copies").get(), getter_Copies(pageTitle)); else if (source == kNC_PageTitleOfflineAndDiskSpace) mStringBundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-offline-and-diskspace").get(), getter_Copies(pageTitle)); else if (source == kNC_PageTitleDiskSpace) mStringBundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-diskspace").get(), getter_Copies(pageTitle)); else if (source == kNC_PageTitleAddressing) mStringBundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-addressing").get(), getter_Copies(pageTitle)); else if (source == kNC_PageTitleSMTP) mStringBundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-smtp").get(), getter_Copies(pageTitle)); else if (source == kNC_PageTitleJunk) mStringBundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-junk").get(), getter_Copies(pageTitle)); else if (source == kNC_PageTitleFakeAccount) { PRBool showFakeAccount; nsCOMPtr<nsIPrefBranch> prefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_SUCCEEDED(rv)) rv = prefBranch->GetBoolPref(PREF_SHOW_FAKE_ACCOUNT, &showFakeAccount); if (showFakeAccount) { nsCOMPtr<nsIStringBundleService> strBundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIStringBundle> bundle; rv = strBundleService->CreateBundle("chrome://messenger/locale/fakeAccount.properties", getter_AddRefs(bundle)); if (NS_SUCCEEDED(rv)) bundle->GetStringFromName(NS_LITERAL_STRING("prefPanel-fake-account").get(), getter_Copies(pageTitle)); } } else { // if it's a server, use the pretty name nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(source, &rv); if (NS_SUCCEEDED(rv) && folder) { PRBool isServer; rv = folder->GetIsServer(&isServer); if (NS_SUCCEEDED(rv) && isServer) rv = folder->GetPrettyName(getter_Copies(pageTitle)); } else { // allow for the accountmanager to be dynamically extended. nsCOMPtr<nsIStringBundleService> strBundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv,rv); const char *sourceValue; rv = source->GetValueConst(&sourceValue); NS_ENSURE_SUCCESS(rv,rv); // make sure the pointer math we're about to do is safe. NS_ENSURE_TRUE(sourceValue && (strlen(sourceValue) > strlen(NC_RDF_PAGETITLE_PREFIX)), NS_ERROR_UNEXPECTED); nsCOMPtr<nsIMsgAccountManager> am = do_QueryReferent(mAccountManager, &rv); NS_ENSURE_SUCCESS(rv, PR_FALSE); // turn NC#PageTitlefoobar into foobar, so we can get the am-foobar.properties bundle nsXPIDLCString chromePackageName; rv = am->GetChromePackageName((sourceValue + strlen(NC_RDF_PAGETITLE_PREFIX)), getter_Copies(chromePackageName)); NS_ENSURE_SUCCESS(rv,rv); nsCAutoString bundleURL; bundleURL = "chrome://"; bundleURL += chromePackageName; bundleURL += "/locale/am-"; bundleURL += (sourceValue + strlen(NC_RDF_PAGETITLE_PREFIX)); bundleURL += ".properties"; nsCOMPtr <nsIStringBundle> bundle; rv = strBundleService->CreateBundle(bundleURL.get(), getter_AddRefs(bundle)); NS_ENSURE_SUCCESS(rv,rv); nsAutoString panelTitleName; panelTitleName.AssignLiteral("prefPanel-"); panelTitleName.AppendWithConversion(sourceValue + strlen(NC_RDF_PAGETITLE_PREFIX)); bundle->GetStringFromName(panelTitleName.get(), getter_Copies(pageTitle)); } } str = pageTitle.get(); } else if (property == kNC_PageTag) { // do NOT localize these strings. these are the urls of the XUL files if (source == kNC_PageTitleServer) str.AssignLiteral("am-server.xul"); else if (source == kNC_PageTitleCopies) str.AssignLiteral("am-copies.xul"); else if ((source == kNC_PageTitleOfflineAndDiskSpace) || (source == kNC_PageTitleDiskSpace)) str.AssignLiteral("am-offline.xul"); else if (source == kNC_PageTitleAddressing) str.AssignLiteral("am-addressing.xul"); else if (source == kNC_PageTitleSMTP) str.AssignLiteral("am-smtp.xul"); else if (source == kNC_PageTitleJunk) str.AssignLiteral("am-junk.xul"); else if (source == kNC_PageTitleFakeAccount) str.AssignLiteral("am-fakeaccount.xul"); else { nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(source, &rv); if (NS_SUCCEEDED(rv) && folder) { /* if this is a server, with no identities, then we show a special panel */ nsCOMPtr<nsIMsgIncomingServer> server; rv = getServerForFolderNode(source, getter_AddRefs(server)); if (server) server->GetAccountManagerChrome(str); else str.AssignLiteral("am-main.xul"); } else { // allow for the accountmanager to be dynamically extended const char *sourceValue; rv = source->GetValueConst(&sourceValue); NS_ENSURE_SUCCESS(rv,rv); // make sure the pointer math we're about to do is safe. NS_ENSURE_TRUE(sourceValue && (strlen(sourceValue) > strlen(NC_RDF_PAGETITLE_PREFIX)), NS_ERROR_UNEXPECTED); // turn NC#PageTitlefoobar into foobar, so we can get the am-foobar.xul file str.AssignLiteral("am-"); str.AppendWithConversion((sourceValue + strlen(NC_RDF_PAGETITLE_PREFIX))); str.AppendLiteral(".xul"); } } } // handle sorting of servers else if ((property == kNC_NameSort) || (property == kNC_FolderTreeNameSort)) { // order for the folder pane // and for the account manager tree is: // // - default mail account // - <other mail accounts> // - "Local Folders" account // - news accounts // - smtp settings (note, this is only in account manager tree) // - fake account // make sure we're handling a root folder that is a server nsCOMPtr<nsIMsgIncomingServer> server; rv = getServerForFolderNode(source, getter_AddRefs(server)); if (NS_SUCCEEDED(rv) && server) { PRInt32 accountNum; nsCOMPtr<nsIMsgAccountManager> am = do_QueryReferent(mAccountManager); if (isDefaultServer(server)) str.AssignLiteral("0000"); else { rv = am->FindServerIndex(server, &accountNum); if (NS_FAILED(rv)) return rv; // this is a hack for now - hardcode server order by type nsXPIDLCString serverType; server->GetType(getter_Copies(serverType)); if (nsCRT::strcasecmp(serverType, "none")==0) accountNum += 2000; else if (nsCRT::strcasecmp(serverType, "nntp")==0) accountNum += 3000; else accountNum += 1000; // default is to appear at the top str.AppendInt(accountNum); } } else { const char *sourceValue; rv = source->GetValueConst(&sourceValue); NS_ENSURE_SUCCESS(rv, NS_RDF_NO_VALUE); // if this is a page (which we determine by the prefix of the URI) // we want to generate a sort value // so that we can sort the categories in the account manager tree // (or the folder pane) // // otherwise, return NS_RDF_NO_VALUE // so that the folder data source will take care of it. if (sourceValue && (strncmp(sourceValue, NC_RDF_PAGETITLE_PREFIX, strlen(NC_RDF_PAGETITLE_PREFIX)) == 0)) { if (source == kNC_PageTitleSMTP) str.AssignLiteral("4000"); else if (source == kNC_PageTitleFakeAccount) str.AssignLiteral("5000"); else if (source == kNC_PageTitleServer) str.AssignLiteral("1"); else if (source == kNC_PageTitleCopies) str.AssignLiteral("2"); else if (source == kNC_PageTitleAddressing) str.AssignLiteral("3"); else if (source == kNC_PageTitleOfflineAndDiskSpace) str.AssignLiteral("4"); else if (source == kNC_PageTitleDiskSpace) str.AssignLiteral("4"); else if (source == kNC_PageTitleJunk) str.AssignLiteral("5"); else { // allow for the accountmanager to be dynamically extended // all the other pages come after the standard ones // server, copies, addressing, disk space (or offline & disk space) str.AssignWithConversion(sourceValue); } } else { return NS_RDF_NO_VALUE; } } } // GetTargets() stuff - need to return a valid answer so that // twisties will appear else if (property == kNC_Settings) { nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(source,&rv); if (NS_FAILED(rv)) return NS_RDF_NO_VALUE; PRBool isServer=PR_FALSE; folder->GetIsServer(&isServer); // no need to localize this! if (isServer) str.AssignLiteral("ServerSettings"); } else if (property == kNC_IsDefaultServer) { nsCOMPtr<nsIMsgIncomingServer> thisServer; rv = getServerForFolderNode(source, getter_AddRefs(thisServer)); if (NS_FAILED(rv) || !thisServer) return NS_RDF_NO_VALUE; if (isDefaultServer(thisServer)) str.AssignLiteral("true"); } else if (property == kNC_SupportsFilters) { nsCOMPtr<nsIMsgIncomingServer> server; rv = getServerForFolderNode(source, getter_AddRefs(server)); if (NS_FAILED(rv) || !server) return NS_RDF_NO_VALUE; if (supportsFilters(server)) str.AssignLiteral("true"); } else if (property == kNC_CanGetMessages) { nsCOMPtr<nsIMsgIncomingServer> server; rv = getServerForFolderNode(source, getter_AddRefs(server)); if (NS_FAILED(rv) || !server) return NS_RDF_NO_VALUE; if (canGetMessages(server)) str.AssignLiteral("true"); } else if (property == kNC_CanGetIncomingMessages) { nsCOMPtr<nsIMsgIncomingServer> server; rv = getServerForFolderNode(source, getter_AddRefs(server)); if (NS_FAILED(rv) || !server) return NS_RDF_NO_VALUE; if (canGetIncomingMessages(server)) str.AssignLiteral("true"); } else if (property == kNC_PageTitleFakeAccount) { if (source == kNC_PageTitleFakeAccount) str.AssignLiteral("true"); } if (!str.IsEmpty()) rv = createNode(str.get(), target, getRDFService()); //if we have an empty string and we don't have an error value, then //we don't have a value for RDF. else if(NS_SUCCEEDED(rv)) rv = NS_RDF_NO_VALUE; return rv; }
nsMsgAccountManagerDataSource::nsMsgAccountManagerDataSource() { #ifdef DEBUG_amds printf("nsMsgAccountManagerDataSource() being created\n"); #endif // do per-class initialization here if (gAccountManagerResourceRefCnt++ == 0) { getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_CHILD), &kNC_Child); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_NAME), &kNC_Name); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_FOLDERTREENAME), &kNC_FolderTreeName); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_FOLDERTREESIMPLENAME), &kNC_FolderTreeSimpleName); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_NAME_SORT), &kNC_NameSort); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_FOLDERTREENAME_SORT), &kNC_FolderTreeNameSort); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETAG), &kNC_PageTag); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_ISDEFAULTSERVER), &kNC_IsDefaultServer); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_SUPPORTSFILTERS), &kNC_SupportsFilters); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_CANGETMESSAGES), &kNC_CanGetMessages); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_CANGETINCOMINGMESSAGES), &kNC_CanGetIncomingMessages); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_ACCOUNT), &kNC_Account); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_SERVER), &kNC_Server); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_IDENTITY), &kNC_Identity); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_JUNK), &kNC_Junk); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_MAIN), &kNC_PageTitleMain); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_SERVER), &kNC_PageTitleServer); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_COPIES), &kNC_PageTitleCopies); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_OFFLINEANDDISKSPACE), &kNC_PageTitleOfflineAndDiskSpace); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_DISKSPACE), &kNC_PageTitleDiskSpace); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_ADDRESSING), &kNC_PageTitleAddressing); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_SMTP), &kNC_PageTitleSMTP); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_JUNK), &kNC_PageTitleJunk); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_FAKEACCOUNT), &kNC_PageTitleFakeAccount); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_ACCOUNTROOT), &kNC_AccountRoot); getRDFService()->GetLiteral(NS_LITERAL_STRING("true").get(), &kTrueLiteral); // eventually these need to exist in some kind of array // that's easily extensible getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_SETTINGS), &kNC_Settings); kDefaultServerAtom = NS_NewAtom("DefaultServer"); } nsCOMPtr<nsIPrefBranch2> prefBranchInternal(do_GetService(NS_PREFSERVICE_CONTRACTID)); if (prefBranchInternal) prefBranchInternal->AddObserver(PREF_SHOW_FAKE_ACCOUNT, this, PR_FALSE); }
nsMsgAccountManagerDataSource::nsMsgAccountManagerDataSource() { #ifdef DEBUG_amds printf("nsMsgAccountManagerDataSource() being created\n"); #endif // do per-class initialization here if (gAccountManagerResourceRefCnt++ == 0) { getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_CHILD), &kNC_Child); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_NAME), &kNC_Name); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_FOLDERTREENAME), &kNC_FolderTreeName); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_FOLDERTREESIMPLENAME), &kNC_FolderTreeSimpleName); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_NAME_SORT), &kNC_NameSort); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_FOLDERTREENAME_SORT), &kNC_FolderTreeNameSort); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETAG), &kNC_PageTag); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_ISDEFAULTSERVER), &kNC_IsDefaultServer); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_SUPPORTSFILTERS), &kNC_SupportsFilters); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_CANGETMESSAGES), &kNC_CanGetMessages); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_CANGETINCOMINGMESSAGES), &kNC_CanGetIncomingMessages); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_ACCOUNT), &kNC_Account); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_SERVER), &kNC_Server); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_IDENTITY), &kNC_Identity); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_JUNK), &kNC_Junk); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_MAIN), &kNC_PageTitleMain); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_SERVER), &kNC_PageTitleServer); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_COPIES), &kNC_PageTitleCopies); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_SYNCHRONIZATION), &kNC_PageTitleSynchronization); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_DISKSPACE), &kNC_PageTitleDiskSpace); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_ADDRESSING), &kNC_PageTitleAddressing); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_SMTP), &kNC_PageTitleSMTP); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_PAGETITLE_JUNK), &kNC_PageTitleJunk); getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_ACCOUNTROOT), &kNC_AccountRoot); getRDFService()->GetLiteral(NS_LITERAL_STRING("true").get(), &kTrueLiteral); // eventually these need to exist in some kind of array // that's easily extensible getRDFService()->GetResource(NS_LITERAL_CSTRING(NC_RDF_SETTINGS), &kNC_Settings); kDefaultServerAtom = MsgNewAtom("DefaultServer").get(); } }