diff --git a/mozilla/browser/components/places/src/nsPlacesImportExportService.cpp b/mozilla/browser/components/places/src/nsPlacesImportExportService.cpp index 2b0d7a56db7..ec818fffcbc 100644 --- a/mozilla/browser/components/places/src/nsPlacesImportExportService.cpp +++ b/mozilla/browser/components/places/src/nsPlacesImportExportService.cpp @@ -1642,14 +1642,11 @@ WriteDateAttribute(const char aAttributeStart[], PRInt32 aLength, PRTime aAttrib // Writes out all the necessary parts of a bookmarks folder. nsresult -nsPlacesImportExportService::WriteContainer(PRInt64 aFolder, const nsACString& aIndent, +nsPlacesImportExportService::WriteContainer(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput) { nsresult rv = WriteContainerHeader(aFolder, aIndent, aOutput); NS_ENSURE_SUCCESS(rv, rv); - - // FIXME bug 334758: write container description here as a
- rv = WriteContainerPrologue(aIndent, aOutput); NS_ENSURE_SUCCESS(rv, rv); rv = WriteContainerContents(aFolder, aIndent, aOutput); @@ -1666,7 +1663,7 @@ nsPlacesImportExportService::WriteContainer(PRInt64 aFolder, const nsACString& a // Remember folders can also have favicons, which we put in the H3 tag nsresult -nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACString& aIndent, +nsPlacesImportExportService::WriteContainerHeader(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput) { PRUint32 dummy; @@ -1682,9 +1679,14 @@ nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACStr rv = aOutput->Write(kContainerIntro, sizeof(kContainerIntro)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); + // get folder id + PRInt64 folderId; + rv = aFolder->GetItemId(&folderId); + NS_ENSURE_SUCCESS(rv, rv); + // write ADD_DATE PRTime dateAdded = 0; - rv = mBookmarksService->GetItemDateAdded(aFolder, &dateAdded); + rv = aFolder->GetDateAdded(&dateAdded); NS_ENSURE_SUCCESS(rv, rv); if (dateAdded) { @@ -1694,7 +1696,7 @@ nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACStr // write LAST_MODIFIED PRTime lastModified = 0; - rv = mBookmarksService->GetItemLastModified(aFolder, &lastModified); + rv = aFolder->GetLastModified(&lastModified); NS_ENSURE_SUCCESS(rv, rv); if (lastModified) { @@ -1715,13 +1717,13 @@ nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACStr NS_ENSURE_SUCCESS(rv,rv); // " PERSONAL_TOOLBAR_FOLDER="true"", etc. - if (aFolder == placesRoot) { + if (folderId == placesRoot) { rv = aOutput->Write(kPlacesRootAttribute, sizeof(kPlacesRootAttribute)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); - } else if (aFolder == bookmarksRoot) { + } else if (folderId == bookmarksRoot) { rv = aOutput->Write(kBookmarksRootAttribute, sizeof(kBookmarksRootAttribute)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); - } else if (aFolder == toolbarFolder) { + } else if (folderId == toolbarFolder) { rv = aOutput->Write(kToolbarFolderAttribute, sizeof(kToolbarFolderAttribute)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); } @@ -1730,7 +1732,7 @@ nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACStr rv = aOutput->Write(kItemIdAttribute, sizeof(kItemIdAttribute)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString itemIdAttr; - itemIdAttr.AppendInt(aFolder); // casting from PRInt64 -> PRInt32, data loss, fix me + itemIdAttr.AppendInt(folderId); // casting from PRInt64 -> PRInt32, data loss, fix me rv = aOutput->Write(itemIdAttr.get(), itemIdAttr.Length(), &dummy); NS_ENSURE_SUCCESS(rv, rv); rv = aOutput->Write(kQuoteStr, sizeof(kQuoteStr)-1, &dummy); @@ -1738,7 +1740,7 @@ nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACStr // favicon (most folders won't have one) nsCOMPtr folderURI; - rv = mBookmarksService->GetFolderURI(aFolder, getter_AddRefs(folderURI)); + rv = mBookmarksService->GetFolderURI(folderId, getter_AddRefs(folderURI)); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString folderSpec; rv = folderURI->GetSpec(folderSpec); @@ -1751,7 +1753,7 @@ nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACStr NS_ENSURE_SUCCESS(rv, rv); // title - rv = WriteContainerTitle(aFolder, aOutput); + rv = WriteTitle(aFolder, aOutput); NS_ENSURE_SUCCESS(rv, rv); // "\n" @@ -1759,27 +1761,32 @@ nsPlacesImportExportService::WriteContainerHeader(PRInt64 aFolder, const nsACStr NS_ENSURE_SUCCESS(rv, rv); // description - rv = WriteDescription(aFolder, nsINavBookmarksService::TYPE_FOLDER, aOutput); + rv = WriteDescription(folderId, nsINavBookmarksService::TYPE_FOLDER, aOutput); NS_ENSURE_SUCCESS(rv, rv); return rv; } -// nsPlacesImportExportService::WriteContainerTitle +// nsPlacesImportExportService::WriteTitle // -// Retrieves, escapes and writes the container title to the stream. +// Retrieves, escapes and writes the title to the stream. nsresult -nsPlacesImportExportService::WriteContainerTitle(PRInt64 aFolder, nsIOutputStream* aOutput) +nsPlacesImportExportService::WriteTitle(nsINavHistoryResultNode* aItem, nsIOutputStream* aOutput) { - nsAutoString title; - nsresult rv; - - rv = mBookmarksService->GetItemTitle(aFolder, title); + // XXX Bug 381767 - support titles for separators + PRUint32 type = 0; + nsresult rv = aItem->GetType(&type); + NS_ENSURE_SUCCESS(rv, rv); + if (type == nsINavHistoryResultNode::RESULT_TYPE_SEPARATOR) + return NS_ERROR_INVALID_ARG; + + nsCAutoString title; + rv = aItem->GetTitle(title); NS_ENSURE_SUCCESS(rv, rv); - char* escapedTitle = nsEscapeHTML(NS_ConvertUTF16toUTF8(title).get()); + char* escapedTitle = nsEscapeHTML(title.get()); if (escapedTitle) { PRUint32 dummy; rv = aOutput->Write(escapedTitle, strlen(escapedTitle), &dummy); @@ -1790,6 +1797,9 @@ nsPlacesImportExportService::WriteContainerTitle(PRInt64 aFolder, nsIOutputStrea } +// nsPlacesImportExportService::WriteDescription +// +// Write description out for all item types. nsresult nsPlacesImportExportService::WriteDescription(PRInt64 aItemId, PRInt32 aType, nsIOutputStream* aOutput) @@ -2003,7 +2013,7 @@ nsPlacesImportExportService::WriteItem(nsINavHistoryResultNode* aItem, // the HREF is optional and points to the source page. nsresult -nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString& aIndent, +nsPlacesImportExportService::WriteLivemark(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput) { PRUint32 dummy; @@ -2019,9 +2029,14 @@ nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString& rv = aOutput->Write(kItemOpen, sizeof(kItemOpen)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); + // get folder id + PRInt64 folderId; + rv = aFolder->GetItemId(&folderId); + NS_ENSURE_SUCCESS(rv, rv); + // get feed URI nsCOMPtr feedURI; - rv = mLivemarkService->GetFeedURI(aFolderId, getter_AddRefs(feedURI)); + rv = mLivemarkService->GetFeedURI(folderId, getter_AddRefs(feedURI)); NS_ENSURE_SUCCESS(rv, rv); nsCString feedSpec; rv = feedURI->GetSpec(feedSpec); @@ -2037,7 +2052,7 @@ nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString& // get the optional site URI nsCOMPtr siteURI; - rv = mLivemarkService->GetSiteURI(aFolderId, getter_AddRefs(siteURI)); + rv = mLivemarkService->GetSiteURI(folderId, getter_AddRefs(siteURI)); NS_ENSURE_SUCCESS(rv, rv); if (siteURI) { nsCString siteSpec; @@ -2057,7 +2072,7 @@ nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString& rv = aOutput->Write(kItemIdAttribute, sizeof(kItemIdAttribute)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString itemIdAttr; - itemIdAttr.AppendInt(aFolderId); // casting from PRInt64 -> PRInt32, data loss, fix me + itemIdAttr.AppendInt(folderId); // casting from PRInt64 -> PRInt32, data loss, fix me rv = aOutput->Write(itemIdAttr.get(), itemIdAttr.Length(), &dummy); NS_ENSURE_SUCCESS(rv, rv); rv = aOutput->Write(kQuoteStr, sizeof(kQuoteStr)-1, &dummy); @@ -2068,7 +2083,7 @@ nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString& NS_ENSURE_SUCCESS(rv, rv); // title - rv = WriteContainerTitle(aFolderId, aOutput); + rv = WriteTitle(aFolder, aOutput); NS_ENSURE_SUCCESS(rv, rv); // '\n' @@ -2076,7 +2091,7 @@ nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString& NS_ENSURE_SUCCESS(rv, rv); // description - rv = WriteDescription(aFolderId, nsINavBookmarksService::TYPE_BOOKMARK, aOutput); + rv = WriteDescription(folderId, nsINavBookmarksService::TYPE_BOOKMARK, aOutput); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; @@ -2169,47 +2184,20 @@ WriteEscapedUrl(const nsCString& aString, nsIOutputStream* aOutput) // indent before writing data. nsresult -nsPlacesImportExportService::WriteContainerContents(PRInt64 aFolder, const nsACString& aIndent, +nsPlacesImportExportService::WriteContainerContents(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput) { nsCAutoString myIndent(aIndent); myIndent.Append(kIndent); - // get empty options - nsresult rv; - nsCOMPtr optionsInterface; - rv = mHistoryService->GetNewQueryOptions(getter_AddRefs(optionsInterface)); + PRInt64 folderId; + nsresult rv = aFolder->GetItemId(&folderId); NS_ENSURE_SUCCESS(rv, rv); - // QueryFolderChildren requires a concrete options - nsCOMPtr options = do_QueryInterface(optionsInterface); - NS_ENSURE_TRUE(options, NS_ERROR_UNEXPECTED); - - // get the query object - nsCOMPtr query; - rv = mHistoryService->GetNewQuery(getter_AddRefs(query)); + nsCOMPtr folderNode = do_QueryInterface(aFolder, &rv); NS_ENSURE_SUCCESS(rv, rv); - // query for just this folder - rv = query->SetFolders(&aFolder, 1); - NS_ENSURE_SUCCESS(rv, rv); - - // group by folder (necessary? doesn't SetFolders trigger this?) - const PRUint16 groupMode = nsINavHistoryQueryOptions::GROUP_BY_FOLDER; - rv = options->SetGroupingMode(&groupMode, 1); - NS_ENSURE_SUCCESS(rv, rv); - - // execute query - nsCOMPtr result; - rv = mHistoryService->ExecuteQuery(query, options, getter_AddRefs(result)); - NS_ENSURE_SUCCESS(rv, rv); - - // get root (folder) node - nsCOMPtr rootNode; - rv = result->GetRoot(getter_AddRefs(rootNode)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = rootNode->SetContainerOpen(PR_TRUE); + rv = folderNode->SetContainerOpen(PR_TRUE); NS_ENSURE_SUCCESS(rv, rv); PRInt64 placesRoot; @@ -2225,21 +2213,21 @@ nsPlacesImportExportService::WriteContainerContents(PRInt64 aFolder, const nsACS NS_ENSURE_SUCCESS(rv,rv); PRUint32 childCount = 0; - rootNode->GetChildCount(&childCount); + folderNode->GetChildCount(&childCount); for (PRUint32 i = 0; i < childCount; ++i) { nsCOMPtr child; - rv = rootNode->GetChild(i, getter_AddRefs(child)); + rv = folderNode->GetChild(i, getter_AddRefs(child)); NS_ENSURE_SUCCESS(rv, rv); PRUint32 type = 0; rv = child->GetType(&type); NS_ENSURE_SUCCESS(rv, rv); if (type == nsINavHistoryResultNode::RESULT_TYPE_FOLDER) { // bookmarks folder - PRInt64 folderId; - rv = child->GetItemId(&folderId); + PRInt64 childFolderId; + rv = child->GetItemId(&childFolderId); NS_ENSURE_SUCCESS(rv, rv); - if (aFolder == placesRoot && (folderId == toolbarFolder || - folderId == bookmarksRoot)) { + if (folderId == placesRoot && (childFolderId == toolbarFolder || + childFolderId == bookmarksRoot)) { // don't write out the bookmarks menu folder from the // places root. When writing to bookmarks.html, it is reparented // to the menu, which is the root of the namespace. This provides @@ -2249,13 +2237,13 @@ nsPlacesImportExportService::WriteContainerContents(PRInt64 aFolder, const nsACS // it could be a regular folder or it could be a livemark PRBool isLivemark; - rv = mLivemarkService->IsLivemark(folderId, &isLivemark); + rv = mLivemarkService->IsLivemark(childFolderId, &isLivemark); NS_ENSURE_SUCCESS(rv, rv); if (isLivemark) - rv = WriteLivemark(folderId, myIndent, aOutput); + rv = WriteLivemark(child, myIndent, aOutput); else - rv = WriteContainer(folderId, myIndent, aOutput); + rv = WriteContainer(child, myIndent, aOutput); } else if (type == nsINavHistoryResultNode::RESULT_TYPE_SEPARATOR) { rv = WriteSeparator(child, myIndent, aOutput); } else { @@ -2266,6 +2254,7 @@ nsPlacesImportExportService::WriteContainerContents(PRInt64 aFolder, const nsACS return NS_OK; } + // nsIPlacesImportExportService::ImportHTMLFromFile // NS_IMETHODIMP @@ -2399,6 +2388,9 @@ nsPlacesImportExportService::ExportHTMLToFile(nsILocalFile* aBookmarksFile) nsAutoString path; aBookmarksFile->GetPath(path); printf("\nExporting %s\n", NS_ConvertUTF16toUTF8(path).get()); + + PRTime startTime = PR_Now(); + printf("\nStart time: %lld\n", startTime); #endif nsresult rv = EnsureServiceState(); @@ -2420,19 +2412,44 @@ nsPlacesImportExportService::ExportHTMLToFile(nsILocalFile* aBookmarksFile) rv = NS_NewBufferedOutputStream(getter_AddRefs(strm), out, 4096); NS_ENSURE_SUCCESS(rv, rv); + // get bookmarks root id + PRInt64 bookmarksRoot; + rv = mBookmarksService->GetBookmarksRoot(&bookmarksRoot); + NS_ENSURE_SUCCESS(rv,rv); + // file header PRUint32 dummy; rv = strm->Write(kFileIntro, sizeof(kFileIntro)-1, &dummy); NS_ENSURE_SUCCESS(rv, rv); + // get empty options + nsCOMPtr options; + rv = mHistoryService->GetNewQueryOptions(getter_AddRefs(options)); + NS_ENSURE_SUCCESS(rv, rv); + + // get a new query object + nsCOMPtr query; + rv = mHistoryService->GetNewQuery(getter_AddRefs(query)); + NS_ENSURE_SUCCESS(rv, rv); + + // query for just this folder + rv = query->SetFolders(&bookmarksRoot, 1); + NS_ENSURE_SUCCESS(rv, rv); + + // execute query + nsCOMPtr result; + rv = mHistoryService->ExecuteQuery(query, options, getter_AddRefs(result)); + NS_ENSURE_SUCCESS(rv, rv); + + // get root (folder) node + nsCOMPtr rootNode; + rv = result->GetRoot(getter_AddRefs(rootNode)); + NS_ENSURE_SUCCESS(rv, rv); + // 'Write(kRootIntro, sizeof(kRootIntro)-1, &dummy); //

GetBookmarksRoot(&bookmarksRoot); - NS_ENSURE_SUCCESS(rv,rv); - // bookmarks menu favicon nsCOMPtr folderURI; rv = mBookmarksService->GetFolderURI(bookmarksRoot, getter_AddRefs(folderURI)); @@ -2446,7 +2463,7 @@ nsPlacesImportExportService::ExportHTMLToFile(nsILocalFile* aBookmarksFile) // '>Bookmarks

rv = strm->Write(kCloseAngle, sizeof(kCloseAngle)-1, &dummy); // > NS_ENSURE_SUCCESS(rv, rv); - rv = WriteContainerTitle(bookmarksRoot, strm); + rv = WriteTitle(rootNode, strm); NS_ENSURE_SUCCESS(rv, rv); rv = strm->Write(kCloseRootH1, sizeof(kCloseRootH1)-1, &dummy); // NS_ENSURE_SUCCESS(rv, rv); @@ -2459,8 +2476,8 @@ nsPlacesImportExportService::ExportHTMLToFile(nsILocalFile* aBookmarksFile) nsCAutoString indent; indent.Assign(kIndent); - // bookmarks menu contents - rv = WriteContainerContents(bookmarksRoot, EmptyCString(), strm); + // write out bookmarks menu contents + rv = WriteContainerContents(rootNode, EmptyCString(), strm); NS_ENSURE_SUCCESS(rv, rv); // epilogue @@ -2470,7 +2487,11 @@ nsPlacesImportExportService::ExportHTMLToFile(nsILocalFile* aBookmarksFile) // commit the write nsCOMPtr safeStream = do_QueryInterface(strm, &rv); NS_ENSURE_SUCCESS(rv, rv); - return safeStream->Finish(); + rv = safeStream->Finish(); +#ifdef DEBUG_EXPORT + printf("\nTotal time in seconds: %lld\n", (PR_Now() - startTime)/1000000); +#endif + return rv; } NS_IMETHODIMP diff --git a/mozilla/browser/components/places/src/nsPlacesImportExportService.h b/mozilla/browser/components/places/src/nsPlacesImportExportService.h index 97e6b894610..70b2dea9b59 100644 --- a/mozilla/browser/components/places/src/nsPlacesImportExportService.h +++ b/mozilla/browser/components/places/src/nsPlacesImportExportService.h @@ -33,12 +33,12 @@ class nsPlacesImportExportService : public nsIPlacesImportExportService nsresult ImportHTMLFromFileInternal(nsILocalFile* aFile, PRBool aAllowRootChanges, PRInt64 aFolder, PRBool aIsImportDefaults); - nsresult WriteContainer(PRInt64 aFolder, const nsACString& aIndent, nsIOutputStream* aOutput); - nsresult WriteContainerHeader(PRInt64 aFolder, const nsACString& aIndent, nsIOutputStream* aOutput); - nsresult WriteContainerTitle(PRInt64 aFolder, nsIOutputStream* aOutput); + nsresult WriteContainer(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput); + nsresult WriteContainerHeader(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput); + nsresult WriteTitle(nsINavHistoryResultNode* aItem, nsIOutputStream* aOutput); nsresult WriteItem(nsINavHistoryResultNode* aItem, const nsACString& aIndent, nsIOutputStream* aOutput); - nsresult WriteLivemark(PRInt64 aFolderId, const nsACString& aIndent, nsIOutputStream* aOutput); - nsresult WriteContainerContents(PRInt64 aFolder, const nsACString& aIndent, nsIOutputStream* aOutput); + nsresult WriteLivemark(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput); + nsresult WriteContainerContents(nsINavHistoryResultNode* aFolder, const nsACString& aIndent, nsIOutputStream* aOutput); nsresult WriteSeparator(nsINavHistoryResultNode* aItem, const nsACString& aIndent, nsIOutputStream* aOutput); nsresult WriteDescription(PRInt64 aId, PRInt32 aType, nsIOutputStream* aOutput); diff --git a/mozilla/toolkit/components/places/src/nsAnnotationService.cpp b/mozilla/toolkit/components/places/src/nsAnnotationService.cpp index 3a839ad45c6..8213aedbd3c 100644 --- a/mozilla/toolkit/components/places/src/nsAnnotationService.cpp +++ b/mozilla/toolkit/components/places/src/nsAnnotationService.cpp @@ -283,7 +283,7 @@ nsAnnotationService::InitTables(mozIStorageConnection* aDBConn) "CREATE INDEX moz_annos_item_idindex ON moz_items_annos (item_id)")); NS_ENSURE_SUCCESS(rv, rv); rv = aDBConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING( - "CREATE INDEX moz_items_annos_attributesindex ON moz_items_annos (anno_attribute_id)")); + "CREATE INDEX moz_items_annos_attributesindex ON moz_items_annos (item_id, anno_attribute_id)")); NS_ENSURE_SUCCESS(rv, rv); }