nsresult
nsAddbookProtocolHandler::GeneratePrintOutput(nsIAddbookUrl *addbookUrl,
        nsString &aOutput)
{
    NS_ENSURE_ARG_POINTER(addbookUrl);

    nsCAutoString uri;
    nsresult rv = addbookUrl->GetPath(uri);
    NS_ENSURE_SUCCESS(rv,rv);

    nsCOMPtr<nsIRDFService> rdfService = do_GetService("@mozilla.org/rdf/rdf-service;1", &rv);
    NS_ENSURE_SUCCESS(rv,rv);

    /* turn
     "//moz-abmdbdirectory/abook.mab?action=print"
     into "moz-abmdbdirectory://abook.mab"
    */

    /* step 1:
     turn "//moz-abmdbdirectory/abook.mab?action=print"
     into "moz-abmdbdirectory/abook.mab?action=print"
     */
    if (uri[0] != '/' && uri[1] != '/')
        return NS_ERROR_UNEXPECTED;

    uri.Cut(0,2);

    /* step 2:
     turn "moz-abmdbdirectory/abook.mab?action=print"
     into "moz-abmdbdirectory/abook.mab"
     */
    PRInt32 pos = uri.Find("?action=print");
    if (pos == -1)
        return NS_ERROR_UNEXPECTED;

    uri.SetLength(pos);

    /* step 2:
     turn "moz-abmdbdirectory/abook.mab"
     into "moz-abmdbdirectory://abook.mab"
     */
    pos = uri.Find("/");
    if (pos == -1)
        return NS_ERROR_UNEXPECTED;

    uri.Insert('/', pos);
    uri.Insert(':', pos);

    nsCOMPtr <nsIRDFResource> resource;
    rv = rdfService->GetResource(uri, getter_AddRefs(resource));
    NS_ENSURE_SUCCESS(rv,rv);

    nsCOMPtr <nsIAbDirectory> directory = do_QueryInterface(resource, &rv);
    NS_ENSURE_SUCCESS(rv,rv);

    rv = BuildDirectoryXML(directory, aOutput);
    NS_ENSURE_SUCCESS(rv,rv);

    return NS_OK;
}
nsresult    
nsAddbookProtocolHandler::GeneratePrintOutput(nsIAddbookUrl *addbookUrl, 
                                              nsString &aOutput)
{
  NS_ENSURE_ARG_POINTER(addbookUrl);

  nsAutoCString uri;
  nsresult rv = addbookUrl->GetPath(uri);
  NS_ENSURE_SUCCESS(rv,rv);

  /* turn
   "//moz-abmdbdirectory/abook.mab?action=print"
   into "moz-abmdbdirectory://abook.mab"
  */

  /* step 1:  
   turn "//moz-abmdbdirectory/abook.mab?action=print"
   into "moz-abmdbdirectory/abook.mab?action=print"
   */
  if (uri[0] != '/' && uri[1] != '/')
    return NS_ERROR_UNEXPECTED;

  uri.Cut(0,2);

  /* step 2:  
   turn "moz-abmdbdirectory/abook.mab?action=print"
   into "moz-abmdbdirectory/abook.mab"
   */
  int32_t pos = uri.Find("?action=print");
	if (pos == -1)
    return NS_ERROR_UNEXPECTED;

  uri.SetLength(pos);

  /* step 2:  
   turn "moz-abmdbdirectory/abook.mab"
   into "moz-abmdbdirectory://abook.mab"
   */
  pos = uri.FindChar('/');
  if (pos == -1)
    return NS_ERROR_UNEXPECTED;

  uri.Insert('/', pos);
  uri.Insert(':', pos);

  nsCOMPtr<nsIAbManager> abManager(do_GetService(NS_ABMANAGER_CONTRACTID, &rv));
  NS_ENSURE_SUCCESS(rv, rv);

  nsCOMPtr<nsIAbDirectory> directory;
  rv = abManager->GetDirectory(uri, getter_AddRefs(directory));
  NS_ENSURE_SUCCESS(rv, rv);

  rv = BuildDirectoryXML(directory, aOutput);
  NS_ENSURE_SUCCESS(rv, rv);

  return NS_OK;
}