From 4b6d90b76b887d1abf4c457dd1d49851629e1b4a Mon Sep 17 00:00:00 2001 From: "rjc%netscape.com" Date: Sun, 7 May 2000 10:15:48 +0000 Subject: [PATCH] Fix bug # 37682: use nsIFile instead of nsFileSpec. --- rdf/datasource/src/nsFileSystemDataSource.cpp | 237 +++++++++++++----- 1 file changed, 173 insertions(+), 64 deletions(-) diff --git a/rdf/datasource/src/nsFileSystemDataSource.cpp b/rdf/datasource/src/nsFileSystemDataSource.cpp index 2341ab088f87..188371e633f8 100644 --- a/rdf/datasource/src/nsFileSystemDataSource.cpp +++ b/rdf/datasource/src/nsFileSystemDataSource.cpp @@ -53,6 +53,11 @@ #include "nsSpecialSystemDirectory.h" #include "nsEnumeratorUtils.h" +#include "nsIURL.h" +#include "nsNetUtil.h" +#include "nsIChannel.h" +#include "nsIFile.h" + #ifdef XP_WIN #include "nsIUnicodeDecoder.h" #include "nsIPlatformCharset.h" @@ -179,10 +184,9 @@ public: static PRBool isFileURI(nsIRDFResource* aResource); static nsresult GetVolumeList(nsISimpleEnumerator **aResult); - static nsresult GetFolderList(nsIRDFResource *source, PRBool allowHidden, nsISimpleEnumerator **aResult); + static nsresult GetFolderList(nsIRDFResource *source, PRBool allowHidden, PRBool onlyFirst, nsISimpleEnumerator **aResult); static nsresult GetName(nsIRDFResource *source, nsIRDFLiteral** aResult); static nsresult GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult); - static PRBool isVisible(const nsNativeFileSpec& file); #ifdef XP_WIN static PRBool isValidFolder(nsIRDFResource *source); @@ -502,14 +506,15 @@ FileSystemDataSource::GetTarget(nsIRDFResource *source, { // Oh this is evil. Somebody kill me now. nsCOMPtr children; - rv = GetFolderList(source, PR_FALSE, getter_AddRefs(children)); + rv = GetFolderList(source, PR_FALSE, PR_TRUE, getter_AddRefs(children)); if (NS_FAILED(rv)) return rv; PRBool hasMore; rv = children->HasMoreElements(&hasMore); if (NS_FAILED(rv)) return rv; - if (hasMore) { + if (hasMore) + { nsCOMPtr isupports; rv = children->GetNext(getter_AddRefs(isupports)); if (NS_FAILED(rv)) return rv; @@ -574,7 +579,7 @@ FileSystemDataSource::GetTargets(nsIRDFResource *source, { if (property == kNC_Child) { - return GetFolderList(source, PR_FALSE, targets); + return GetFolderList(source, PR_FALSE, PR_FALSE, targets); } else if (property == kNC_Name) { @@ -606,18 +611,18 @@ FileSystemDataSource::GetTargets(nsIRDFResource *source, } else if (property == kRDF_type) { - nsXPIDLCString uri; - rv = kNC_FileSystemObject->GetValue( getter_Copies(uri) ); + const char *uri = nsnull; + rv = kNC_FileSystemObject->GetValueConst( &uri ); if (NS_FAILED(rv)) return rv; - nsAutoString url; url.AssignWithConversion(uri); - nsIRDFLiteral *literal; + nsAutoString url; + url.AssignWithConversion(uri); - rv = gRDFService->GetLiteral(url.GetUnicode(), &literal); + nsCOMPtr literal; + rv = gRDFService->GetLiteral(url.GetUnicode(), getter_AddRefs(literal)); if (NS_FAILED(rv)) return rv; nsISimpleEnumerator* result = new nsSingletonEnumerator(literal); - NS_RELEASE(literal); if (! result) return NS_ERROR_OUT_OF_MEMORY; @@ -628,12 +633,12 @@ FileSystemDataSource::GetTargets(nsIRDFResource *source, } else if (property == kNC_pulse) { - nsIRDFLiteral *pulseLiteral; - rv = gRDFService->GetLiteral(NS_ConvertASCIItoUCS2("12").GetUnicode(), &pulseLiteral); + nsCOMPtr pulseLiteral; + rv = gRDFService->GetLiteral(NS_ConvertASCIItoUCS2("12").GetUnicode(), + getter_AddRefs(pulseLiteral)); if (NS_FAILED(rv)) return rv; nsISimpleEnumerator* result = new nsSingletonEnumerator(pulseLiteral); - NS_RELEASE(pulseLiteral); if (! result) return NS_ERROR_OUT_OF_MEMORY; @@ -782,17 +787,37 @@ FileSystemDataSource::ArcLabelsOut(nsIRDFResource *source, } else if (isFileURI(source)) { + const char *uri = nsnull; + rv = source->GetValueConst( &uri ); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr fileURI; + if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(fileURI), uri))) + return(rv); + if (!fileURI) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr channel; + if (NS_FAILED(rv = NS_OpenURI(getter_AddRefs(channel), fileURI, nsnull, nsnull))) + return(rv); + if (!channel) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr fileChannel = do_QueryInterface(channel); + if (!fileChannel) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr aDir; + if (NS_FAILED(rv = fileChannel->GetFile(getter_AddRefs(aDir)))) + return(rv); + + PRBool isDirFlag = PR_FALSE; + if (NS_FAILED(rv = aDir->IsDirectory(&isDirFlag))) + return(rv); + nsCOMPtr array; rv = NS_NewISupportsArray(getter_AddRefs(array)); if (NS_FAILED(rv)) return rv; - nsXPIDLCString uri; - rv = source->GetValue( getter_Copies(uri) ); - if (NS_FAILED(rv)) return rv; - - nsFileURL fileURL(uri); - nsFileSpec fileSpec(fileURL); - if (fileSpec.IsDirectory()) { + if (isDirFlag == PR_TRUE) + { #ifdef XP_WIN if (isValidFolder(source) == PR_TRUE) { @@ -995,15 +1020,6 @@ FileSystemDataSource::GetVolumeList(nsISimpleEnumerator** aResult) -PRBool -FileSystemDataSource::isVisible(const nsNativeFileSpec& file) -{ - PRBool isVisible = (!file.IsHidden()); - return(isVisible); -} - - - #ifdef XP_WIN PRBool FileSystemDataSource::isValidFolder(nsIRDFResource *source) @@ -1023,7 +1039,7 @@ FileSystemDataSource::isValidFolder(nsIRDFResource *source) isValid = PR_FALSE; nsCOMPtr folderEnum; - if (NS_SUCCEEDED(rv = GetFolderList(source, PR_TRUE, getter_AddRefs(folderEnum)))) + if (NS_SUCCEEDED(rv = GetFolderList(source, PR_TRUE, PR_FALSE, getter_AddRefs(folderEnum)))) { PRBool hasAny = PR_FALSE, hasMore; while (NS_SUCCEEDED(folderEnum->HasMoreElements(&hasMore)) && @@ -1064,36 +1080,109 @@ FileSystemDataSource::isValidFolder(nsIRDFResource *source) nsresult -FileSystemDataSource::GetFolderList(nsIRDFResource *source, PRBool allowHidden, nsISimpleEnumerator** aResult) +FileSystemDataSource::GetFolderList(nsIRDFResource *source, PRBool allowHidden, + PRBool onlyFirst, nsISimpleEnumerator** aResult) { nsresult rv; nsCOMPtr nameArray; rv = NS_NewISupportsArray(getter_AddRefs(nameArray)); if (NS_FAILED(rv)) return rv; - const char *uri; - rv = source->GetValueConst(&uri); + const char *parentURI = nsnull; + rv = source->GetValueConst(&parentURI); if (NS_FAILED(rv)) return(rv); + if (!parentURI) return(NS_ERROR_UNEXPECTED); - nsFileURL parentDir(uri); - nsNativeFileSpec nativeDir(parentDir); - for (nsDirectoryIterator i(nativeDir, PR_FALSE); i.Exists(); i++) + nsCOMPtr fileURI; + if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(fileURI), parentURI))) + return(rv); + if (!fileURI) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr channel; + if (NS_FAILED(rv = NS_OpenURI(getter_AddRefs(channel), fileURI, nsnull, nsnull))) + return(rv); + if (!channel) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr fileChannel = do_QueryInterface(channel); + if (!fileChannel) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr aDir; + if (NS_FAILED(rv = fileChannel->GetFile(getter_AddRefs(aDir)))) + return(rv); + + nsCOMPtr dirContents; + if (NS_FAILED(rv = aDir->GetDirectoryEntries(getter_AddRefs(dirContents)))) + return(rv); + if (!dirContents) return(NS_ERROR_UNEXPECTED); + + PRBool hasMore; + while(NS_SUCCEEDED(rv = dirContents->HasMoreElements(&hasMore)) && + (hasMore == PR_TRUE)) { - const nsNativeFileSpec nativeSpec = (const nsNativeFileSpec &)i; + nsCOMPtr isupports; + if (NS_FAILED(rv = dirContents->GetNext(getter_AddRefs(isupports)))) + break; + + nsCOMPtr aFile = do_QueryInterface(isupports); + if (!aFile) break; if (allowHidden == PR_FALSE) { - if (!isVisible(nativeSpec)) continue; + PRBool hiddenFlag = PR_FALSE; + if (NS_FAILED(rv = aFile->IsHidden(&hiddenFlag))) + break; + if (hiddenFlag == PR_TRUE) continue; } - nsFileURL fileURL(nativeSpec); - const char *childURL = fileURL.GetAsString(); - if (childURL != nsnull) + PRUnichar *leafUni = nsnull; + if (NS_FAILED(rv = aFile->GetUnicodeLeafName(&leafUni))) + break; + if (!leafUni) break; + + nsAutoString fullURI; + fullURI.AssignWithConversion(parentURI); + if (fullURI.Last() != PRUnichar('/')) { - nsCOMPtr file; - gRDFService->GetResource(childURL, getter_AddRefs(file)); - nameArray->AppendElement(file); + fullURI.Append(PRUnichar('/')); } + + nsAutoString leaf(leafUni); + Recycle(leafUni); + leafUni = nsnull; + + // we need to escape this leaf name; + // for now, let's just hack it and encode spaces and slashes + PRInt32 aOffset; + while ((aOffset = leaf.FindChar(' ')) >= 0) + { + leaf.Cut(aOffset, 1); + leaf.InsertWithConversion("%20", aOffset); + } + while ((aOffset = leaf.FindChar('/')) >= 0) + { + leaf.Cut(aOffset, 1); + leaf.InsertWithConversion("%2F", aOffset); + } + + // append the encoded name + fullURI.Append(leaf); + + PRBool dirFlag = PR_FALSE; + if (NS_FAILED(rv = aFile->IsDirectory(&dirFlag))) + break; + if (dirFlag == PR_TRUE) + { + // XXX hmmm, causes problems getting name, + // so comment it out for the short term +// fullURI.Append(PRUnichar('/')); + } + + nsCOMPtr fileRes; + gRDFService->GetUnicodeResource(fullURI.GetUnicode(), getter_AddRefs(fileRes)); + + nameArray->AppendElement(fileRes); + + if (onlyFirst == PR_TRUE) break; } nsISimpleEnumerator* result = new nsArrayEnumerator(nameArray); @@ -1112,14 +1201,38 @@ nsresult FileSystemDataSource::GetName(nsIRDFResource *source, nsIRDFLiteral **aResult) { nsresult rv; - const char *uri; + const char *uri = nsnull; + rv = source->GetValueConst(&uri); if (NS_FAILED(rv)) return(rv); + if (!uri) return(NS_ERROR_UNEXPECTED); - nsFileURL url(uri); - nsNativeFileSpec native(url); - nsAutoString name; - native.GetLeafName(name); + nsCOMPtr fileURI; + if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(fileURI), uri))) + return(rv); + if (!fileURI) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr channel; + if (NS_FAILED(rv = NS_OpenURI(getter_AddRefs(channel), fileURI, nsnull, nsnull))) + return(rv); + if (!channel) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr fileChannel = do_QueryInterface(channel); + if (!fileChannel) return(NS_ERROR_UNEXPECTED); + + nsCOMPtr aFile; + if (NS_FAILED(rv = fileChannel->GetFile(getter_AddRefs(aFile)))) + return(rv); + if (!aFile) return(NS_ERROR_UNEXPECTED); + + PRUnichar *nameUni = nsnull; + if (NS_FAILED(rv = aFile->GetUnicodeLeafName(&nameUni))) + return(rv); + if (!nameUni) return(NS_ERROR_UNEXPECTED); + + nsAutoString name(nameUni); + Recycle(nameUni); + nameUni = nsnull; #ifdef XP_WIN @@ -1140,6 +1253,7 @@ FileSystemDataSource::GetName(nsIRDFResource *source, nsIRDFLiteral **aResult) #endif #ifdef XP_BEOS +#if 0 // XXX fix me // under BEOS, try and get the "META:title" attribute (if its a file) nsAutoString theURI; theURI.AssignWithConversion(uri); if (theURI.Find(netPositiveDir) == 0) @@ -1166,11 +1280,10 @@ FileSystemDataSource::GetName(nsIRDFResource *source, nsIRDFLiteral **aResult) } } } +#endif #endif - nsIRDFLiteral *literal; - gRDFService->GetLiteral(name.GetUnicode(), &literal); - *aResult = literal; + gRDFService->GetLiteral(name.GetUnicode(), aResult); return NS_OK; } @@ -1254,9 +1367,8 @@ FileSystemDataSource::GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult) const char *uri; rv = source->GetValueConst(&uri); if (NS_FAILED(rv)) return(rv); - nsAutoString url; url.AssignWithConversion(uri); - - nsIRDFLiteral *literal = nsnull; + nsAutoString url; + url.AssignWithConversion(uri); #ifdef XP_WIN // under Windows, if its an IE favorite, munge the URL @@ -1264,8 +1376,7 @@ FileSystemDataSource::GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult) { if (url.Find(ieFavoritesDir) == 0) { - rv = getIEFavoriteURL(source, url, &literal); - *aResult = literal; + rv = getIEFavoriteURL(source, url, aResult); return(rv); } } @@ -1277,8 +1388,7 @@ FileSystemDataSource::GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult) { if (url.Find(netPositiveDir) == 0) { - rv = getNetPositiveURL(source, url, &literal); - *aResult = literal; + rv = getNetPositiveURL(source, url, aResult); return(rv); } } @@ -1287,9 +1397,9 @@ FileSystemDataSource::GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult) // if we fall through to here, its not any type of bookmark // stored in the platform native file system, so just set the URL - gRDFService->GetLiteral(url.GetUnicode(), &literal); - *aResult = literal; - return NS_OK; + gRDFService->GetLiteral(url.GetUnicode(), aResult); + + return(NS_OK); } @@ -1332,4 +1442,3 @@ FileSystemDataSource::getNetPositiveURL(nsIRDFResource *source, nsString aFileUR } #endif -