Fix bug # 46229: get file: URL view to display file sizes and last mod dates. r=waterson

This commit is contained in:
rjc%netscape.com 2000-07-26 23:39:49 +00:00
parent 54e6f7c03f
commit 0aba552bc6

View File

@ -43,6 +43,7 @@
#include "xp_core.h" #include "xp_core.h"
#include "plhash.h" #include "plhash.h"
#include "plstr.h" #include "plstr.h"
#include "prlong.h"
#include "prmem.h" #include "prmem.h"
#include "prprf.h" #include "prprf.h"
#include "prio.h" #include "prio.h"
@ -52,7 +53,6 @@
#include "nsIRDFFileSystem.h" #include "nsIRDFFileSystem.h"
#include "nsSpecialSystemDirectory.h" #include "nsSpecialSystemDirectory.h"
#include "nsEnumeratorUtils.h" #include "nsEnumeratorUtils.h"
#include "nsIURL.h" #include "nsIURL.h"
#include "nsNetUtil.h" #include "nsNetUtil.h"
#include "nsIChannel.h" #include "nsIChannel.h"
@ -96,6 +96,8 @@ private:
static nsIRDFResource *kNC_Child; static nsIRDFResource *kNC_Child;
static nsIRDFResource *kNC_Name; static nsIRDFResource *kNC_Name;
static nsIRDFResource *kNC_URL; static nsIRDFResource *kNC_URL;
static nsIRDFResource *kNC_Length;
static nsIRDFResource *kWEB_LastMod;
static nsIRDFResource *kNC_FileSystemObject; static nsIRDFResource *kNC_FileSystemObject;
static nsIRDFResource *kNC_pulse; static nsIRDFResource *kNC_pulse;
static nsIRDFResource *kRDF_InstanceOf; static nsIRDFResource *kRDF_InstanceOf;
@ -131,6 +133,8 @@ public:
static nsresult GetFolderList(nsIRDFResource *source, PRBool allowHidden, PRBool onlyFirst, nsISimpleEnumerator **aResult); static nsresult GetFolderList(nsIRDFResource *source, PRBool allowHidden, PRBool onlyFirst, nsISimpleEnumerator **aResult);
static nsresult GetName(nsIRDFResource *source, nsIRDFLiteral** aResult); static nsresult GetName(nsIRDFResource *source, nsIRDFLiteral** aResult);
static nsresult GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult); static nsresult GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult);
static nsresult GetFileSize(nsIRDFResource *source, nsIRDFInt** aResult);
static nsresult GetLastMod(nsIRDFResource *source, nsIRDFDate** aResult);
#ifdef XP_WIN #ifdef XP_WIN
static PRBool isValidFolder(nsIRDFResource *source); static PRBool isValidFolder(nsIRDFResource *source);
@ -154,6 +158,8 @@ nsIRDFResource *FileSystemDataSource::kNC_FileSystemRoot;
nsIRDFResource *FileSystemDataSource::kNC_Child; nsIRDFResource *FileSystemDataSource::kNC_Child;
nsIRDFResource *FileSystemDataSource::kNC_Name; nsIRDFResource *FileSystemDataSource::kNC_Name;
nsIRDFResource *FileSystemDataSource::kNC_URL; nsIRDFResource *FileSystemDataSource::kNC_URL;
nsIRDFResource *FileSystemDataSource::kNC_Length;
nsIRDFResource *FileSystemDataSource::kWEB_LastMod;
nsIRDFResource *FileSystemDataSource::kNC_FileSystemObject; nsIRDFResource *FileSystemDataSource::kNC_FileSystemObject;
nsIRDFResource *FileSystemDataSource::kNC_pulse; nsIRDFResource *FileSystemDataSource::kNC_pulse;
nsIRDFResource *FileSystemDataSource::kRDF_InstanceOf; nsIRDFResource *FileSystemDataSource::kRDF_InstanceOf;
@ -205,7 +211,7 @@ FileSystemDataSource::isDirURI(nsIRDFResource* source)
nsCOMPtr<nsIURI> aIURI; nsCOMPtr<nsIURI> aIURI;
if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(aIURI), uri))) if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(aIURI), uri)))
return(rv); return(PR_FALSE);
if (!aIURI) return(PR_FALSE); if (!aIURI) return(PR_FALSE);
nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(aIURI); nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(aIURI);
@ -268,15 +274,17 @@ FileSystemDataSource::FileSystemDataSource(void)
*/ */
#endif #endif
gRDFService->GetResource(kURINC_FileSystemRoot, &kNC_FileSystemRoot); gRDFService->GetResource(kURINC_FileSystemRoot, &kNC_FileSystemRoot);
gRDFService->GetResource(NC_NAMESPACE_URI "child", &kNC_Child); gRDFService->GetResource(NC_NAMESPACE_URI "child", &kNC_Child);
gRDFService->GetResource(NC_NAMESPACE_URI "Name", &kNC_Name); gRDFService->GetResource(NC_NAMESPACE_URI "Name", &kNC_Name);
gRDFService->GetResource(NC_NAMESPACE_URI "URL", &kNC_URL); gRDFService->GetResource(NC_NAMESPACE_URI "URL", &kNC_URL);
gRDFService->GetResource(NC_NAMESPACE_URI "FileSystemObject", &kNC_FileSystemObject); gRDFService->GetResource(NC_NAMESPACE_URI "Content-Length", &kNC_Length);
gRDFService->GetResource(NC_NAMESPACE_URI "pulse", &kNC_pulse); gRDFService->GetResource(WEB_NAMESPACE_URI "LastModifiedDate", &kWEB_LastMod);
gRDFService->GetResource(NC_NAMESPACE_URI "FileSystemObject", &kNC_FileSystemObject);
gRDFService->GetResource(NC_NAMESPACE_URI "pulse", &kNC_pulse);
gRDFService->GetResource(RDF_NAMESPACE_URI "instanceOf", &kRDF_InstanceOf); gRDFService->GetResource(RDF_NAMESPACE_URI "instanceOf", &kRDF_InstanceOf);
gRDFService->GetResource(RDF_NAMESPACE_URI "type", &kRDF_type); gRDFService->GetResource(RDF_NAMESPACE_URI "type", &kRDF_type);
gFileSystemDataSource = this; gFileSystemDataSource = this;
} }
@ -296,8 +304,10 @@ FileSystemDataSource::~FileSystemDataSource (void)
NS_RELEASE(kNC_Child); NS_RELEASE(kNC_Child);
NS_RELEASE(kNC_Name); NS_RELEASE(kNC_Name);
NS_RELEASE(kNC_URL); NS_RELEASE(kNC_URL);
NS_RELEASE(kNC_FileSystemObject); NS_RELEASE(kNC_Length);
NS_RELEASE(kNC_pulse); NS_RELEASE(kWEB_LastMod);
NS_RELEASE(kNC_FileSystemObject);
NS_RELEASE(kNC_pulse);
NS_RELEASE(kRDF_InstanceOf); NS_RELEASE(kRDF_InstanceOf);
NS_RELEASE(kRDF_type); NS_RELEASE(kRDF_type);
@ -393,6 +403,8 @@ FileSystemDataSource::GetTarget(nsIRDFResource *source,
if (! target) if (! target)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
*target = nsnull;
nsresult rv = NS_RDF_NO_VALUE; nsresult rv = NS_RDF_NO_VALUE;
// we only have positive assertions in the file system data source. // we only have positive assertions in the file system data source.
@ -430,6 +442,26 @@ FileSystemDataSource::GetTarget(nsIRDFResource *source,
return url->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target); return url->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target);
} }
else if (property == kNC_Length)
{
nsCOMPtr<nsIRDFInt> fileSize;
rv = GetFileSize(source, getter_AddRefs(fileSize));
if (NS_FAILED(rv)) return(rv);
if (!fileSize) rv = NS_RDF_NO_VALUE;
if (rv == NS_RDF_NO_VALUE) return(rv);
return fileSize->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target);
}
else if (property == kWEB_LastMod)
{
nsCOMPtr<nsIRDFDate> lastMod;
rv = GetLastMod(source, getter_AddRefs(lastMod));
if (NS_FAILED(rv)) return(rv);
if (!lastMod) rv = NS_RDF_NO_VALUE;
if (rv == NS_RDF_NO_VALUE) return(rv);
return lastMod->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target);
}
else if (property == kRDF_type) else if (property == kRDF_type)
{ {
const char *type; const char *type;
@ -444,7 +476,9 @@ FileSystemDataSource::GetTarget(nsIRDFResource *source,
rv = source->GetValueConst(&uri); rv = source->GetValueConst(&uri);
if (NS_FAILED(rv)) return(rv); if (NS_FAILED(rv)) return(rv);
nsAutoString theURI;theURI.AssignWithConversion(uri); nsAutoString theURI;
theURI.AssignWithConversion(uri);
if (theURI.Find(ieFavoritesDir) == 0) if (theURI.Find(ieFavoritesDir) == 0)
{ {
if (theURI[theURI.Length() - 1] == '/') if (theURI[theURI.Length() - 1] == '/')
@ -455,50 +489,48 @@ FileSystemDataSource::GetTarget(nsIRDFResource *source,
{ {
rv = kNC_IEFavoriteObject->GetValueConst(&type); rv = kNC_IEFavoriteObject->GetValueConst(&type);
} }
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return(rv);
} }
} }
#endif #endif
nsAutoString url; url.AssignWithConversion(type); nsAutoString url;
nsIRDFLiteral *literal; url.AssignWithConversion(type);
gRDFService->GetLiteral(url.GetUnicode(), &literal); nsCOMPtr<nsIRDFLiteral> literal;
gRDFService->GetLiteral(url.GetUnicode(), getter_AddRefs(literal));
rv = literal->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target); rv = literal->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target);
NS_RELEASE(literal); return(rv);
return rv;
} }
else if (property == kNC_pulse) else if (property == kNC_pulse)
{ {
nsIRDFLiteral *pulseLiteral; nsCOMPtr<nsIRDFLiteral> pulseLiteral;
gRDFService->GetLiteral(NS_ConvertASCIItoUCS2("12").GetUnicode(), &pulseLiteral); gRDFService->GetLiteral(NS_ConvertASCIItoUCS2("12").GetUnicode(), getter_AddRefs(pulseLiteral));
rv = pulseLiteral->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target); rv = pulseLiteral->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target);
NS_RELEASE(pulseLiteral); return(rv);
return rv;
} }
else if (property == kNC_Child) else if (property == kNC_Child)
{ {
// Oh this is evil. Somebody kill me now. // Oh this is evil. Somebody kill me now.
nsCOMPtr<nsISimpleEnumerator> children; nsCOMPtr<nsISimpleEnumerator> children;
rv = GetFolderList(source, PR_FALSE, PR_TRUE, getter_AddRefs(children)); rv = GetFolderList(source, PR_FALSE, PR_TRUE, getter_AddRefs(children));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return(rv);
PRBool hasMore; PRBool hasMore;
rv = children->HasMoreElements(&hasMore); rv = children->HasMoreElements(&hasMore);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return(rv);
if (hasMore) if (hasMore)
{ {
nsCOMPtr<nsISupports> isupports; nsCOMPtr<nsISupports> isupports;
rv = children->GetNext(getter_AddRefs(isupports)); rv = children->GetNext(getter_AddRefs(isupports));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return(rv);
return isupports->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target); return isupports->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target);
} }
} }
} }
*target = nsnull; return(NS_RDF_NO_VALUE);
return NS_RDF_NO_VALUE;
} }
@ -521,6 +553,8 @@ FileSystemDataSource::GetTargets(nsIRDFResource *source,
if (! targets) if (! targets)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
*targets = nsnull;
// we only have positive assertions in the file system data source. // we only have positive assertions in the file system data source.
if (! tv) if (! tv)
return NS_RDF_NO_VALUE; return NS_RDF_NO_VALUE;
@ -1198,6 +1232,99 @@ FileSystemDataSource::GetFolderList(nsIRDFResource *source, PRBool allowHidden,
nsresult
FileSystemDataSource::GetLastMod(nsIRDFResource *source, nsIRDFDate **aResult)
{
*aResult = nsnull;
nsresult rv;
const char *uri = nsnull;
rv = source->GetValueConst(&uri);
if (NS_FAILED(rv)) return(rv);
if (!uri) return(NS_ERROR_UNEXPECTED);
nsCOMPtr<nsIURI> aIURI;
if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(aIURI), uri)))
return(rv);
nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(aIURI);
if (!fileURL) return(PR_FALSE);
nsCOMPtr<nsIFile> aFile;
if (NS_FAILED(rv = fileURL->GetFile(getter_AddRefs(aFile))))
return(rv);
if (!aFile) return(NS_ERROR_UNEXPECTED);
PRInt64 lastModDate;
if (NS_FAILED(rv = aFile->GetLastModificationDate(&lastModDate)))
return(rv);
// convert from milliseconds to seconds
PRTime temp64, thousand;
LL_I2L(thousand, PR_MSEC_PER_SEC);
LL_MUL(temp64, lastModDate, thousand);
gRDFService->GetDateLiteral(temp64, aResult);
return(NS_OK);
}
nsresult
FileSystemDataSource::GetFileSize(nsIRDFResource *source, nsIRDFInt **aResult)
{
*aResult = nsnull;
nsresult rv;
const char *uri = nsnull;
rv = source->GetValueConst(&uri);
if (NS_FAILED(rv)) return(rv);
if (!uri) return(NS_ERROR_UNEXPECTED);
nsCOMPtr<nsIURI> aIURI;
if (NS_FAILED(rv = NS_NewURI(getter_AddRefs(aIURI), uri)))
return(rv);
nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(aIURI);
if (!fileURL) return(PR_FALSE);
nsCOMPtr<nsIFile> aFile;
if (NS_FAILED(rv = fileURL->GetFile(getter_AddRefs(aFile))))
return(rv);
if (!aFile) return(NS_ERROR_UNEXPECTED);
// don't do anything with directories
PRBool isDir = PR_FALSE;
if (NS_FAILED(rv = aFile->IsDirectory(&isDir)))
return(rv);
if (isDir == PR_TRUE)
return(NS_RDF_NO_VALUE);
PRInt64 aFileSize64;
#ifdef XP_MAC
// on Mac, get total file size (data + resource fork)
nsCOMPtr<nsILocalFileMac> aMacFile = do_QueryInterface(aFile);
if (!aMacFile) return(NS_ERROR_UNEXPECTED);
if (NS_FAILED(rv = aMacFile->GetFileSizeWithResFork(&aFileSize64)))
return(rv);
#else
if (NS_FAILED(rv = aFile->GetFileSize(&aFileSize64)))
return(rv);
#endif
// convert 64bits to 32bits
PRInt32 aFileSize32 = 0;
LL_L2I(aFileSize32, aFileSize64);
gRDFService->GetIntLiteral(aFileSize32, aResult);
return(NS_OK);
}
nsresult nsresult
FileSystemDataSource::GetName(nsIRDFResource *source, nsIRDFLiteral **aResult) FileSystemDataSource::GetName(nsIRDFResource *source, nsIRDFLiteral **aResult)
{ {