NS_IMETHODIMP
nsMsgAccountManagerDataSource::HasArcOut(nsIRDFResource *source, nsIRDFResource *aArc, PRBool *result)
{
  nsresult rv = NS_OK;
  if (aArc == kNC_Settings) {
    // based on createSettingsResources()
    // we only have settings for local folders and servers with identities
    nsCOMPtr<nsIMsgIncomingServer> server;
    rv = getServerForFolderNode(source, getter_AddRefs(server));
    if (server) {
      // Check the offline capability before adding arc
      PRInt32 offlineSupportLevel = 0;
      (void) server->GetOfflineSupportLevel(&offlineSupportLevel);
      if (offlineSupportLevel >= OFFLINE_SUPPORT_LEVEL_REGULAR) {
        *result = PR_TRUE;
        return NS_OK;
      }

      PRBool supportsDiskSpace;
      (void) server->GetSupportsDiskSpace(&supportsDiskSpace);
      if (supportsDiskSpace) {
        *result = PR_TRUE;
        return NS_OK;
      }
      return serverHasIdentities(server, result);
    }
  }

  *result = PR_FALSE;
  return NS_OK;
}
// end of all #Settings arcs
nsresult
nsMsgAccountManagerDataSource::createSettingsResources(nsIRDFResource *aSource,
                                                       nsISupportsArray *aNodeArray)
{
  // If this isn't a server, just return.
  if (aSource == kNC_PageTitleSMTP)
    return NS_OK;

  nsCOMPtr<nsIMsgIncomingServer> server;
  nsresult rv = getServerForFolderNode(aSource, getter_AddRefs(server));
  NS_ENSURE_SUCCESS(rv, rv);
  if (server) {
    PRBool hasIdentities;
    rv = serverHasIdentities(server, &hasIdentities);

    if (hasIdentities) {
      aNodeArray->AppendElement(kNC_PageTitleServer);
      aNodeArray->AppendElement(kNC_PageTitleCopies);
      aNodeArray->AppendElement(kNC_PageTitleAddressing);
    }

    // Junk settings apply for all server types except for news and rss.
    nsCString serverType;
    server->GetType(serverType);
    if (!serverType.LowerCaseEqualsLiteral("nntp") &&
        !serverType.LowerCaseEqualsLiteral("rss"))
      aNodeArray->AppendElement(kNC_PageTitleJunk);

    // Check the offline capability before adding
    // offline item
    PRInt32 offlineSupportLevel = 0;
    rv = server->GetOfflineSupportLevel(&offlineSupportLevel);
    NS_ENSURE_SUCCESS(rv,rv);

    PRBool supportsDiskSpace;
    rv = server->GetSupportsDiskSpace(&supportsDiskSpace);
    NS_ENSURE_SUCCESS(rv,rv);

    // currently there is no offline without diskspace
    if (offlineSupportLevel >= OFFLINE_SUPPORT_LEVEL_REGULAR) 
      aNodeArray->AppendElement(kNC_PageTitleOfflineAndDiskSpace);
    else if (supportsDiskSpace)
      aNodeArray->AppendElement(kNC_PageTitleDiskSpace);

    if (hasIdentities) {
      // extensions come after the default panels
      rv = appendGenericSettingsResources(server, aNodeArray);
      NS_ASSERTION(NS_SUCCEEDED(rv), "failed to add generic panels");
    }
  }

  return NS_OK;
}