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 @@ - + + + + + - @@ -68,6 +70,15 @@ + + + + + + + + + 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";