diff --git a/xpfe/components/bookmarks/resources/bookmarks.js b/xpfe/components/bookmarks/resources/bookmarks.js
index 8b7110fc3093..2e59da8ac3d0 100644
--- a/xpfe/components/bookmarks/resources/bookmarks.js
+++ b/xpfe/components/bookmarks/resources/bookmarks.js
@@ -734,6 +734,10 @@ function fillContextMenu(name)
+const nsIFilePicker = Components.interfaces.nsIFilePicker;
+
+
+
function doContextCmd(cmdName)
{
debug("doContextCmd start: cmd='" + cmdName + "'");
@@ -776,6 +780,54 @@ function doContextCmd(cmdName)
var promptStr = bundle.GetStringFromName("DeleteItems");
if (!confirm(promptStr)) return(false);
}
+ else if (cmdName == "http://home.netscape.com/NC-rdf#command?cmd=import")
+ {
+ try
+ {
+ var filePicker = Components.classes["component://netscape/filespecwithui"].createInstance();
+ if (filePicker) filePicker = filePicker.QueryInterface(Components.interfaces.nsIFileSpecWithUI);
+ if (!filePicker) return(false);
+
+ var promptStr = bundle.GetStringFromName("SelectImport");
+
+ filePicker.chooseInputFile(promptStr, 2, "", ""); // 2 = html filter
+ var filespec = filePicker.QueryInterface(Components.interfaces.nsIFileSpec);
+ if (!filespec) return(false);
+ var filename = filespec.URLString;
+ if ((!filename) || (filename == "")) return(false);
+
+ debug("Import: '" + filename + "'\n");
+ urlVal = filename;
+ }
+ catch(ex)
+ {
+ return(false);
+ }
+ }
+ else if (cmdName == "http://home.netscape.com/NC-rdf#command?cmd=export")
+ {
+ try
+ {
+ var filePicker = Components.classes["component://netscape/filespecwithui"].createInstance();
+ if (filePicker) filePicker = filePicker.QueryInterface(Components.interfaces.nsIFileSpecWithUI);
+ if (!filePicker) return(false);
+
+ var promptStr = bundle.GetStringFromName("EnterExport");
+
+ filePicker.chooseOutputFile(promptStr, "bookmarks.html", 2); // 2 = html filter
+ var filespec = filePicker.QueryInterface(Components.interfaces.nsIFileSpec);
+ if (!filespec) return(false);
+ var filename = filespec.URLString;
+ if ((!filename) || (filename == "")) return(false);
+
+ debug("Export: '" + filename + "'\n");
+ urlVal = filename;
+ }
+ catch(ex)
+ {
+ return(false);
+ }
+ }
var treeNode = document.getElementById("bookmarksTree");
if (!treeNode) return(false);
diff --git a/xpfe/components/bookmarks/resources/bookmarks.xul b/xpfe/components/bookmarks/resources/bookmarks.xul
index 10b7f106cb8a..d7800766c21c 100644
--- a/xpfe/components/bookmarks/resources/bookmarks.xul
+++ b/xpfe/components/bookmarks/resources/bookmarks.xul
@@ -48,14 +48,16 @@
-
+
+
+
+
+
+
+
+
diff --git a/xpfe/components/bookmarks/resources/locale/en-US/bookmark.properties b/xpfe/components/bookmarks/resources/locale/en-US/bookmark.properties
index 1f282141fede..cc47f400dad9 100755
--- a/xpfe/components/bookmarks/resources/locale/en-US/bookmark.properties
+++ b/xpfe/components/bookmarks/resources/locale/en-US/bookmark.properties
@@ -33,6 +33,9 @@ SetNewSearchFolder = Set as New Internet Search Folder
BookmarkProperties = Properties...
+Import = Import...
+Export = Export...
+
ImportedIEFavorites = Imported IE Favorites
ImportedNetPositiveBookmarks = Imported NetPositive Bookmarks
@@ -44,6 +47,9 @@ NewFolderNamePrompt = Enter a name for the new folder:
NeedValidURL = Please enter a valid, fully qualified URL.
+SelectImport = Import bookmark file:
+EnterExport = Export bookmark file:
+
DeleteItems = Delete the selected item(s)?
WebPageUpdated = The following web page has been updated:
diff --git a/xpfe/components/bookmarks/resources/locale/en-US/bookmarks.dtd b/xpfe/components/bookmarks/resources/locale/en-US/bookmarks.dtd
index f8511f403507..aaa9fbcd9eaf 100644
--- a/xpfe/components/bookmarks/resources/locale/en-US/bookmarks.dtd
+++ b/xpfe/components/bookmarks/resources/locale/en-US/bookmarks.dtd
@@ -26,7 +26,10 @@
+
+
+
@@ -37,6 +40,12 @@
+
+
+
+
+
+
diff --git a/xpfe/components/bookmarks/src/nsBookmarksService.cpp b/xpfe/components/bookmarks/src/nsBookmarksService.cpp
index 4b1bde707a8f..f1a837642dba 100644
--- a/xpfe/components/bookmarks/src/nsBookmarksService.cpp
+++ b/xpfe/components/bookmarks/src/nsBookmarksService.cpp
@@ -179,6 +179,8 @@ nsIRDFResource *kNC_BookmarkCommand_DeleteBookmarkSeparator;
nsIRDFResource *kNC_BookmarkCommand_SetNewBookmarkFolder;
nsIRDFResource *kNC_BookmarkCommand_SetPersonalToolbarFolder;
nsIRDFResource *kNC_BookmarkCommand_SetNewSearchFolder;
+nsIRDFResource *kNC_BookmarkCommand_Import;
+nsIRDFResource *kNC_BookmarkCommand_Export;
@@ -242,6 +244,8 @@ bm_AddRefGlobals()
gRDF->GetResource(NC_NAMESPACE_URI "command?cmd=setnewbookmarkfolder", &kNC_BookmarkCommand_SetNewBookmarkFolder);
gRDF->GetResource(NC_NAMESPACE_URI "command?cmd=setpersonaltoolbarfolder",&kNC_BookmarkCommand_SetPersonalToolbarFolder);
gRDF->GetResource(NC_NAMESPACE_URI "command?cmd=setnewsearchfolder", &kNC_BookmarkCommand_SetNewSearchFolder);
+ gRDF->GetResource(NC_NAMESPACE_URI "command?cmd=import", &kNC_BookmarkCommand_Import);
+ gRDF->GetResource(NC_NAMESPACE_URI "command?cmd=export", &kNC_BookmarkCommand_Export);
}
return NS_OK;
}
@@ -299,10 +303,11 @@ bm_ReleaseGlobals()
NS_IF_RELEASE(kNC_BookmarkCommand_DeleteBookmark);
NS_IF_RELEASE(kNC_BookmarkCommand_DeleteBookmarkFolder);
NS_IF_RELEASE(kNC_BookmarkCommand_DeleteBookmarkSeparator);
-
NS_IF_RELEASE(kNC_BookmarkCommand_SetNewBookmarkFolder);
NS_IF_RELEASE(kNC_BookmarkCommand_SetPersonalToolbarFolder);
NS_IF_RELEASE(kNC_BookmarkCommand_SetNewSearchFolder);
+ NS_IF_RELEASE(kNC_BookmarkCommand_Import);
+ NS_IF_RELEASE(kNC_BookmarkCommand_Export);
}
}
@@ -1661,7 +1666,7 @@ nsresult ExamineBookmarkSchedule(nsIRDFResource *theBookmark, PRBool & examineFl
nsresult GetBookmarkToPing(nsIRDFResource **theBookmark);
nsresult GetBookmarksFile(nsFileSpec* aResult);
- nsresult WriteBookmarks(nsIRDFDataSource *ds, nsIRDFResource *root);
+ nsresult WriteBookmarks(nsFileSpec *bookmarksFile, nsIRDFDataSource *ds, nsIRDFResource *root);
nsresult WriteBookmarksContainer(nsIRDFDataSource *ds, nsOutputFileStream strm, nsIRDFResource *container, PRInt32 level, nsISupportsArray *parentArray);
nsresult GetTextForNode(nsIRDFNode* aNode, nsString& aResult);
nsresult UpdateBookmarkLastModifiedDate(nsIRDFResource *aSource);
@@ -1674,6 +1679,8 @@ nsresult GetBookmarkToPing(nsIRDFResource **theBookmark);
nsresult deleteBookmarkItem(nsIRDFResource *src, nsISupportsArray *aArguments, PRInt32 parentArgIndex, nsIRDFResource *objType);
nsresult setFolderHint(nsIRDFResource *src, nsIRDFResource *objType);
nsresult getFolderViaHint(nsIRDFResource *src, PRBool fallbackFlag, nsIRDFResource **folder);
+ nsresult importBookmarks(nsISupportsArray *aArguments);
+ nsresult exportBookmarks(nsISupportsArray *aArguments);
nsresult getResourceFromLiteralNode(nsIRDFNode *node, nsIRDFResource **res);
@@ -3059,6 +3066,10 @@ nsBookmarksService::GetTarget(nsIRDFResource* aSource,
getLocaleString("SetPersonalToolbarFolder", name);
else if (aSource == kNC_BookmarkCommand_SetNewSearchFolder)
getLocaleString("SetNewSearchFolder", name);
+ else if (aSource == kNC_BookmarkCommand_Import)
+ getLocaleString("Import", name);
+ else if (aSource == kNC_BookmarkCommand_Export)
+ getLocaleString("Export", name);
if (name.Length() > 0)
{
@@ -3774,6 +3785,69 @@ nsBookmarksService::getFolderViaHint(nsIRDFResource *objType, PRBool fallbackFla
+nsresult
+nsBookmarksService::importBookmarks(nsISupportsArray *aArguments)
+{
+ // look for #URL which is the "file:///" URL to import
+ nsresult rv;
+ nsCOMPtr aNode;
+ if (NS_FAILED(rv = getArgumentN(aArguments, kNC_URL, 0, getter_AddRefs(aNode))))
+ return(rv);
+ nsCOMPtr pathLiteral = do_QueryInterface(aNode);
+ if (!pathLiteral) return(NS_ERROR_NO_INTERFACE);
+
+ const PRUnichar *pathUni = nsnull;
+ pathLiteral->GetValueConst(&pathUni);
+ if (!pathUni) return(NS_ERROR_NULL_POINTER);
+
+ nsAutoString fileName(pathUni);
+ nsFileURL fileURL(fileName);
+ nsFileSpec fileSpec(fileURL);
+ if (!fileSpec.IsFile()) return(NS_ERROR_UNEXPECTED);
+
+ // figure out where to add the imported bookmarks
+ nsCOMPtr newBookmarkFolder;
+ if (NS_FAILED(rv = getFolderViaHint(kNC_NewBookmarkFolder, PR_TRUE,
+ getter_AddRefs(newBookmarkFolder))))
+ return(rv);
+
+ // read 'em in
+ BookmarkParser parser;
+ parser.Init(&fileSpec, mInner, nsAutoString(""));
+ parser.Parse(newBookmarkFolder, kNC_Bookmark);
+
+ return(NS_OK);
+}
+
+
+
+nsresult
+nsBookmarksService::exportBookmarks(nsISupportsArray *aArguments)
+{
+ // look for #URL which is the "file:///" URL to export
+ nsresult rv;
+ nsCOMPtr aNode;
+ if (NS_FAILED(rv = getArgumentN(aArguments, kNC_URL, 0, getter_AddRefs(aNode))))
+ return(rv);
+ nsCOMPtr pathLiteral = do_QueryInterface(aNode);
+ if (!pathLiteral) return(NS_ERROR_NO_INTERFACE);
+
+ const PRUnichar *pathUni = nsnull;
+ pathLiteral->GetValueConst(&pathUni);
+ if (!pathUni) return(NS_ERROR_NULL_POINTER);
+
+ nsAutoString fileName(pathUni);
+ nsFileURL fileURL(fileName);
+ nsFileSpec fileSpec(fileURL);
+
+ // write 'em out
+ rv = WriteBookmarks(&fileSpec, mInner, kNC_BookmarksRoot);
+
+ return(rv);
+}
+
+
+
NS_IMETHODIMP
nsBookmarksService::DoCommand(nsISupportsArray *aSources, nsIRDFResource *aCommand,
nsISupportsArray *aArguments)
@@ -3787,6 +3861,10 @@ nsBookmarksService::DoCommand(nsISupportsArray *aSources, nsIRDFResource *aComma
return(NS_ERROR_ILLEGAL_VALUE);
}
+ // Note: some commands only run once (instead of looping over selection);
+ // if that's the case, be sure to "break" (if success) so that "mDirty"
+ // is set (and "bookmarks.html" will be flushed out shortly afterwards)
+
for (loop=((PRInt32)numSources)-1; loop>=0; loop--)
{
nsCOMPtr aSource = aSources->ElementAt(loop);
@@ -3796,21 +3874,21 @@ nsBookmarksService::DoCommand(nsISupportsArray *aSources, nsIRDFResource *aComma
if (aCommand == kNC_BookmarkCommand_NewBookmark)
{
- if (NS_FAILED(rv = insertBookmarkItem(src, aArguments,
- loop, kNC_Bookmark)))
- return(rv);
+ rv = insertBookmarkItem(src, aArguments, loop, kNC_Bookmark);
+ if (NS_FAILED(rv)) return(rv);
+ break;
}
else if (aCommand == kNC_BookmarkCommand_NewFolder)
{
- if (NS_FAILED(rv = insertBookmarkItem(src, aArguments,
- loop, kNC_Folder)))
- return(rv);
+ rv = insertBookmarkItem(src, aArguments, loop, kNC_Folder);
+ if (NS_FAILED(rv)) return(rv);
+ break;
}
else if (aCommand == kNC_BookmarkCommand_NewSeparator)
{
- if (NS_FAILED(rv = insertBookmarkItem(src, aArguments,
- loop, kNC_BookmarkSeparator)))
- return(rv);
+ rv = insertBookmarkItem(src, aArguments, loop, kNC_BookmarkSeparator);
+ if (NS_FAILED(rv)) return(rv);
+ break;
}
else if (aCommand == kNC_BookmarkCommand_DeleteBookmark)
{
@@ -3832,18 +3910,33 @@ nsBookmarksService::DoCommand(nsISupportsArray *aSources, nsIRDFResource *aComma
}
else if (aCommand == kNC_BookmarkCommand_SetNewBookmarkFolder)
{
- if (NS_FAILED(rv = setFolderHint(src, kNC_NewBookmarkFolder)))
- return(rv);
+ rv = setFolderHint(src, kNC_NewBookmarkFolder);
+ if (NS_FAILED(rv)) return(rv);
+ break;
}
else if (aCommand == kNC_BookmarkCommand_SetPersonalToolbarFolder)
{
- if (NS_FAILED(rv = setFolderHint(src, kNC_PersonalToolbarFolder)))
- return(rv);
+ rv = setFolderHint(src, kNC_PersonalToolbarFolder);
+ if (NS_FAILED(rv)) return(rv);
+ break;
}
else if (aCommand == kNC_BookmarkCommand_SetNewSearchFolder)
{
- if (NS_FAILED(rv = setFolderHint(src, kNC_NewSearchFolder)))
- return(rv);
+ rv = setFolderHint(src, kNC_NewSearchFolder);
+ if (NS_FAILED(rv)) return(rv);
+ break;
+ }
+ else if (aCommand == kNC_BookmarkCommand_Import)
+ {
+ rv = importBookmarks(aArguments);
+ if (NS_FAILED(rv)) return(rv);
+ break;
+ }
+ else if (aCommand == kNC_BookmarkCommand_Export)
+ {
+ rv = exportBookmarks(aArguments);
+ if (NS_FAILED(rv)) return(rv);
+ break;
}
}
@@ -3886,7 +3979,14 @@ nsBookmarksService::Flush()
if (mBookmarksAvailable == PR_TRUE)
{
- rv = WriteBookmarks(mInner, kNC_BookmarksRoot);
+ nsFileSpec bookmarksFile;
+ rv = GetBookmarksFile(&bookmarksFile);
+
+ // Oh well, couldn't get the bookmarks file. Guess there
+ // aren't any bookmarks for us to write out.
+ if (NS_FAILED(rv)) return NS_OK;
+
+ rv = WriteBookmarks(&bookmarksFile, mInner, kNC_BookmarksRoot);
}
return(rv);
}
@@ -4222,24 +4322,20 @@ nsBookmarksService::ReadBookmarks()
nsresult
-nsBookmarksService::WriteBookmarks(nsIRDFDataSource *ds, nsIRDFResource *root)
+nsBookmarksService::WriteBookmarks(nsFileSpec *bookmarksFile, nsIRDFDataSource *ds,
+ nsIRDFResource *root)
{
- nsresult rv;
-
- nsFileSpec bookmarksFile;
- rv = GetBookmarksFile(&bookmarksFile);
-
- // Oh well, couldn't get the bookmarks file. Guess there
- // aren't any bookmarks for us to write out.
- if (NS_FAILED(rv))
- return NS_OK;
+ if (!bookmarksFile) return(NS_ERROR_NULL_POINTER);
+ if (!ds) return(NS_ERROR_NULL_POINTER);
+ if (!root) return(NS_ERROR_NULL_POINTER);
+ nsresult rv;
nsCOMPtr parentArray;
if (NS_FAILED(rv = NS_NewISupportsArray(getter_AddRefs(parentArray))))
return(rv);
rv = NS_ERROR_FAILURE;
- nsOutputFileStream strm(bookmarksFile);
+ nsOutputFileStream strm(*bookmarksFile);
if (strm.is_open())
{
strm << "\n";