1998-03-28 05:44:41 +03:00
|
|
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Netscape Public License
|
|
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
|
|
* http://www.mozilla.org/NPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* NPL.
|
|
|
|
*
|
|
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
|
|
* Communications Corporation. Portions created by Netscape are
|
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
|
|
* Reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
This file implements file system support for the rdf data model.
|
|
|
|
For more information on this file, contact rjc or guha
|
|
|
|
For more information on RDF, look at the RDF section of www.mozilla.org
|
|
|
|
*/
|
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
#include "atalk.h"
|
1998-03-28 05:44:41 +03:00
|
|
|
#include "fs2rdf.h"
|
|
|
|
#include "glue.h"
|
1998-07-15 21:26:32 +04:00
|
|
|
#include "mcf.h"
|
1998-03-28 05:44:41 +03:00
|
|
|
|
|
|
|
/* external string references in allxpstr */
|
|
|
|
extern int RDF_UNABLETODELETEFILE, RDF_UNABLETODELETEFOLDER;
|
|
|
|
|
1998-07-23 21:36:59 +04:00
|
|
|
#define IMPORT_LIST_SIZE 8
|
|
|
|
|
|
|
|
/* XXX localization */
|
|
|
|
char *importList[IMPORT_LIST_SIZE] = {"Favorites", "NC:Bookmarks", "Recent", "NC:Bookmarks",
|
|
|
|
"Start Menu", "NC:Bookmarks", "Desktop", "NC:LocalFiles"};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
importForProfile (char *dir, const char *uname)
|
|
|
|
{
|
|
|
|
int32 n = 0;
|
|
|
|
char* pn = getMem(100 + strlen(dir));
|
|
|
|
char* name = getMem(100 + strlen(uname));
|
|
|
|
RDF_Resource item;
|
|
|
|
RDF_Resource parent;
|
|
|
|
while (n < IMPORT_LIST_SIZE) {
|
|
|
|
sprintf(pn, "%s%s/", dir, importList[n++]);
|
|
|
|
item = RDF_GetResource(NULL, pn, 1);
|
|
|
|
parent = RDF_GetResource(NULL, importList[n++], 1);
|
|
|
|
sprintf(name, "%s IE %s", uname, importList[n-2]);
|
|
|
|
remoteStoreAdd(gRemoteStore, item, gCoreVocab->RDF_name, copyString(name),
|
|
|
|
RDF_STRING_TYPE, 1);
|
|
|
|
remoteStoreAdd(gRemoteStore, item, gCoreVocab->RDF_parent, parent, RDF_RESOURCE_TYPE, 1);
|
|
|
|
}
|
|
|
|
freeMem(pn);
|
|
|
|
freeMem(name);
|
|
|
|
}
|
|
|
|
|
1998-03-28 05:44:41 +03:00
|
|
|
|
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
void
|
|
|
|
GuessIEBookmarks (void)
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
|
|
|
#ifdef XP_WIN
|
1998-06-03 21:35:31 +04:00
|
|
|
RDF_Resource bmk = RDF_GetResource(NULL, "NC:Bookmarks", true);
|
|
|
|
PRDir* ProfilesDir = OpenDir("file:///c|/winnt/profiles/");
|
1998-07-23 21:36:59 +04:00
|
|
|
if (!ProfilesDir) {
|
|
|
|
/* XXX localization */
|
|
|
|
importForProfile("file:///c|/windows/", "Your");
|
1998-06-03 21:35:31 +04:00
|
|
|
} else {
|
|
|
|
int32 n = PR_SKIP_BOTH;
|
|
|
|
PRDirEntry *de;
|
|
|
|
while (de = PR_ReadDir(ProfilesDir, n++)) {
|
|
|
|
if (strcmp(de->name, "Administrator") && strcmp(de->name, "Default User") &&
|
|
|
|
strcmp(de->name, "All Users")) {
|
1998-07-23 21:36:59 +04:00
|
|
|
char* dir = getMem(100 + strlen(de->name));
|
|
|
|
sprintf(dir, "file:///c|/winnt/profiles/%s/", de->name);
|
|
|
|
importForProfile(dir, de->name);
|
|
|
|
freeMem(dir);
|
1998-06-03 21:35:31 +04:00
|
|
|
}
|
|
|
|
}
|
1998-07-15 23:22:02 +04:00
|
|
|
PR_CloseDir(ProfilesDir);
|
1998-06-03 21:35:31 +04:00
|
|
|
}
|
1998-03-28 05:44:41 +03:00
|
|
|
#endif
|
1998-06-03 21:35:31 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char *
|
|
|
|
getVolume(int16 volNum, PRBool afpVols)
|
|
|
|
{
|
|
|
|
char *url = NULL;
|
1998-03-28 05:44:41 +03:00
|
|
|
|
|
|
|
#ifdef XP_MAC
|
1998-06-03 21:35:31 +04:00
|
|
|
AFPXVolMountInfo afpInfo;
|
1998-03-28 05:44:41 +03:00
|
|
|
ParamBlockRec pb;
|
1998-06-03 21:35:31 +04:00
|
|
|
char *encoded, str[64], *temp1, *temp2;
|
|
|
|
PRBool isAfpVol;
|
1998-03-28 05:44:41 +03:00
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
XP_BZERO((void *)&pb, sizeof(pb));
|
1998-03-28 05:44:41 +03:00
|
|
|
pb.volumeParam.ioCompletion = NULL;
|
|
|
|
pb.volumeParam.ioVolIndex = volNum + 1;
|
|
|
|
pb.volumeParam.ioNamePtr = (void *)str;
|
|
|
|
if (!PBGetVInfo(&pb,FALSE)) {
|
1998-06-03 21:35:31 +04:00
|
|
|
/* network volumes (via AFP) should be represented
|
|
|
|
by afp URLS instead of file URLs */
|
|
|
|
|
|
|
|
isAfpVol = isAFPVolume(pb.volumeParam.ioVRefNum);
|
|
|
|
if ((afpVols == PR_FALSE) && (isAfpVol == PR_FALSE))
|
|
|
|
{
|
|
|
|
str[1+(unsigned)str[0]] = '\0';
|
|
|
|
if ((encoded = NET_Escape((char *)&str[1], URL_XALPHAS)) != NULL)
|
|
|
|
{
|
|
|
|
url = PR_smprintf("file:///%s/", encoded);
|
|
|
|
XP_FREE(encoded);
|
|
|
|
}
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
else if ((afpVols == PR_TRUE) && (isAfpVol == PR_TRUE))
|
|
|
|
{
|
|
|
|
XP_BZERO((void *)&afpInfo, sizeof(afpInfo));
|
|
|
|
afpInfo.length = (short)sizeof(afpInfo);
|
|
|
|
|
|
|
|
pb.ioParam.ioCompletion = NULL;
|
|
|
|
/* use pb.ioParam.ioVRefNum */
|
|
|
|
pb.ioParam.ioBuffer = (Ptr)&afpInfo;
|
|
|
|
|
|
|
|
if (!PBGetVolMountInfo(&pb))
|
|
|
|
{
|
|
|
|
str[1+(unsigned)str[0]] = '\0';
|
|
|
|
|
|
|
|
temp1 = getMem(1024);
|
|
|
|
temp2 = getMem(1024);
|
|
|
|
|
|
|
|
strcpy(temp1, "afp:/at/");
|
|
|
|
/* server name */
|
|
|
|
strncpy((void *)temp2, &afpInfo.AFPData[afpInfo.serverNameOffset-30+1],
|
|
|
|
(unsigned int)afpInfo.AFPData[afpInfo.serverNameOffset-30]);
|
|
|
|
temp2[(unsigned int)afpInfo.AFPData[afpInfo.serverNameOffset-30]] = '\0';
|
|
|
|
strcat(temp1, (void *)NET_Escape((void *)temp2, URL_XALPHAS));
|
|
|
|
strcat(temp1, ":");
|
|
|
|
/* zone name */
|
|
|
|
strncpy((void *)temp2, &afpInfo.AFPData[afpInfo.zoneNameOffset-30+1],
|
|
|
|
(unsigned int)afpInfo.AFPData[afpInfo.zoneNameOffset-30]);
|
|
|
|
temp2[(unsigned int)afpInfo.AFPData[afpInfo.zoneNameOffset-30]] = '\0';
|
|
|
|
strcat(temp1, (void *)NET_Escape((void *)temp2, URL_XALPHAS));
|
|
|
|
strcat(temp1, "/");
|
|
|
|
/* volume name */
|
|
|
|
strcat(temp1, NET_Escape((char *)&str[1], URL_XALPHAS));
|
|
|
|
strcat(temp1,"/");
|
|
|
|
url = copyString(temp1);
|
|
|
|
|
|
|
|
freeMem(temp1);
|
|
|
|
freeMem(temp2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
1998-03-28 05:44:41 +03:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef XP_WIN
|
1998-06-03 21:35:31 +04:00
|
|
|
UINT driveType;
|
|
|
|
char str[32];
|
|
|
|
|
1998-03-28 05:44:41 +03:00
|
|
|
/* Windows-specific method for getting drive info without touching the drives (Dave H.) */
|
1998-06-03 21:35:31 +04:00
|
|
|
sprintf(str, "%c:\\", volNum + 'A');
|
|
|
|
driveType = GetDriveType(str);
|
1998-03-28 05:44:41 +03:00
|
|
|
if (driveType != DRIVE_UNKNOWN && driveType != DRIVE_NO_ROOT_DIR)
|
|
|
|
{
|
1998-07-23 21:36:59 +04:00
|
|
|
url = PR_smprintf("file:///%c|/", volNum + 'A');
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1998-04-13 05:38:17 +04:00
|
|
|
#ifdef XP_UNIX
|
1998-06-03 21:35:31 +04:00
|
|
|
if (volNum == 0)
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
url = PR_smprintf("file:///");
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
1998-04-14 05:26:35 +04:00
|
|
|
#endif
|
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
return(url);
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRDir *
|
|
|
|
OpenDir(char *name)
|
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
PRDir *d = NULL;
|
|
|
|
|
1998-04-14 05:26:35 +04:00
|
|
|
if (startsWith("file:///", name))
|
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
d = CallPROpenDirUsingFileURL(name);
|
1998-04-14 05:26:35 +04:00
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
return(d);
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RDFT
|
|
|
|
MakeLFSStore (char* url)
|
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
RDFT ntr;
|
|
|
|
|
|
|
|
if ((ntr = (RDFT)getMem(sizeof(struct RDF_TranslatorStruct))) != NULL)
|
|
|
|
{
|
1998-07-23 21:36:59 +04:00
|
|
|
ntr->assert = fsAssert;
|
1998-06-03 21:35:31 +04:00
|
|
|
ntr->unassert = fsUnassert;
|
|
|
|
ntr->getSlotValue = fsGetSlotValue;
|
|
|
|
ntr->getSlotValues = fsGetSlotValues;
|
|
|
|
ntr->hasAssertion = fsHasAssertion;
|
|
|
|
ntr->nextValue = fsNextValue;
|
|
|
|
ntr->disposeCursor = fsDisposeCursor;
|
|
|
|
ntr->url = copyString(url);
|
|
|
|
}
|
|
|
|
return(ntr);
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
1998-07-23 21:36:59 +04:00
|
|
|
PRBool
|
|
|
|
fsAssert (RDFT rdf, RDF_Resource u, RDF_Resource s, void* v,
|
|
|
|
RDF_ValueType type, PRBool tv)
|
|
|
|
{
|
|
|
|
PRBool retVal = PR_FALSE;
|
|
|
|
#ifdef XP_MAC
|
|
|
|
AEAddressDesc finderAddr = { typeNull, NULL };
|
|
|
|
AEDescList selection = { typeNull, NULL };
|
|
|
|
AppleEvent theEvent = { typeNull, NULL }, theReply = { typeNull, NULL };
|
|
|
|
FSSpec fss;
|
|
|
|
OSErr err;
|
|
|
|
ProcessSerialNumber finderPSN = { 0, kNoProcess };
|
|
|
|
char *errorMsg;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if ((startsWith("file://", resourceID(u))) && (s == gNavCenter->RDF_Command))
|
|
|
|
{
|
|
|
|
#ifdef XP_MAC
|
|
|
|
if (((RDF_Resource)v) == gNavCenter->RDF_Command_Reveal)
|
|
|
|
{
|
|
|
|
/* reveal item in Finder */
|
|
|
|
retVal = PR_TRUE;
|
|
|
|
if ((err = nativeMacPathname(resourceID(u), &fss)) != noErr) {}
|
|
|
|
else if ((err = getPSNbyTypeSig(&finderPSN, 'FNDR', 'MACS')) != noErr) {}
|
|
|
|
else if ((err = AECreateDesc(typeProcessSerialNumber, &finderPSN,
|
|
|
|
sizeof(ProcessSerialNumber), &finderAddr)) != noErr) {}
|
|
|
|
else if ((err = AECreateAppleEvent(kAEFinderEvents /* kAEFinderSuite */,
|
|
|
|
kAERevealSelection, &finderAddr, kAutoGenerateReturnID,
|
|
|
|
kAnyTransactionID, &theEvent)) != noErr) {}
|
|
|
|
else if ((err = AECreateList (NULL, 0, false, &selection)) != noErr) {}
|
|
|
|
else if ((err = AEPutPtr (&selection, 0, typeFSS, &fss, sizeof(FSSpec))) != noErr) {}
|
|
|
|
else if ((err = AEPutParamDesc (&theEvent, keySelection, &selection)) != noErr) {}
|
|
|
|
else err = AESend (&theEvent, &theReply, kAENoReply, kAENormalPriority,
|
|
|
|
kAEDefaultTimeout, NULL, NULL);
|
|
|
|
|
|
|
|
if (err == noErr)
|
|
|
|
{
|
|
|
|
SetFrontProcess(&finderPSN);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ((errorMsg = PR_smprintf("Error %d", (int)err)) != NULL)
|
|
|
|
{
|
|
|
|
FE_Alert(NULL, errorMsg);
|
|
|
|
XP_FREE(errorMsg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (finderAddr.dataHandle != NULL) AEDisposeDesc(&finderAddr);
|
|
|
|
if (selection.dataHandle != NULL) AEDisposeDesc (&selection);
|
|
|
|
if (theEvent.dataHandle != NULL) AEDisposeDesc(&theEvent);
|
|
|
|
if (theReply.dataHandle != NULL) AEDisposeDesc(&theReply);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
return(retVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef XP_MAC
|
|
|
|
OSErr
|
|
|
|
nativeMacPathname(char *fileURL, FSSpec *fss)
|
|
|
|
{
|
|
|
|
OSErr err = paramErr;
|
|
|
|
char *macURL = NULL, *token, *url, *escapedURL, *temp, *pascalStr;
|
|
|
|
|
|
|
|
XP_ASSERT(fileURL != NULL);
|
|
|
|
if (fileURL == NULL) return(NULL);
|
|
|
|
|
|
|
|
if (!startsWith("file:///", fileURL)) return(NULL);
|
|
|
|
if (!(url = copyString(fileURL + strlen("file:///")))) return(NULL);
|
|
|
|
|
|
|
|
token = strtok(url, "/");
|
|
|
|
while (token != NULL)
|
|
|
|
{
|
|
|
|
*token;
|
|
|
|
if ((escapedURL = unescapeURL(token)) == NULL)
|
|
|
|
{
|
|
|
|
if (macURL != NULL)
|
|
|
|
{
|
|
|
|
freeMem(macURL);
|
|
|
|
macURL = NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (macURL == NULL)
|
|
|
|
{
|
|
|
|
macURL = escapedURL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
temp = append2Strings(macURL, ":");
|
|
|
|
freeMem(macURL);
|
|
|
|
if (temp == NULL)
|
|
|
|
{
|
|
|
|
macURL = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
macURL = append2Strings(temp, escapedURL);
|
|
|
|
freeMem(temp);
|
|
|
|
if (macURL == NULL)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
freeMem(escapedURL);
|
|
|
|
}
|
|
|
|
token = strtok(NULL, "/");
|
|
|
|
}
|
|
|
|
if (endsWith("/", fileURL))
|
|
|
|
{
|
|
|
|
temp = append2Strings(macURL, ":");
|
|
|
|
freeMem(macURL);
|
|
|
|
macURL = temp;
|
|
|
|
}
|
|
|
|
freeMem(url);
|
|
|
|
if (macURL != NULL)
|
|
|
|
{
|
|
|
|
if ((pascalStr = getMem(strlen(macURL) + 3)) != NULL)
|
|
|
|
{
|
|
|
|
pascalStr[0] = strlen(macURL);
|
|
|
|
strcpy(&pascalStr[1], macURL);
|
|
|
|
err = FSMakeFSSpec(0, 0L, (void *)pascalStr, fss);
|
|
|
|
freeMem(pascalStr);
|
|
|
|
}
|
|
|
|
freeMem(macURL);
|
|
|
|
}
|
|
|
|
return(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OSErr
|
|
|
|
getPSNbyTypeSig(ProcessSerialNumber *thePSN, OSType pType, OSType pSignature)
|
|
|
|
{
|
|
|
|
OSErr err;
|
|
|
|
ProcessInfoRec pInfo;
|
|
|
|
|
|
|
|
thePSN->highLongOfPSN=0L;
|
|
|
|
thePSN->lowLongOfPSN=kNoProcess;
|
|
|
|
while (!(err=GetNextProcess(thePSN)))
|
|
|
|
{
|
|
|
|
if ((thePSN->highLongOfPSN==0L) && (thePSN->lowLongOfPSN==kNoProcess))
|
|
|
|
{
|
|
|
|
err=procNotFound;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
pInfo.processInfoLength=sizeof(ProcessInfoRec);
|
|
|
|
pInfo.processName=NULL;
|
|
|
|
pInfo.processLocation=NULL;
|
|
|
|
pInfo.processAppSpec=NULL;
|
|
|
|
if ((err=GetProcessInformation(thePSN,&pInfo)) != noErr) break;
|
|
|
|
if ((pInfo.processType==pType) && (pInfo.processSignature==pSignature)) break;
|
|
|
|
}
|
|
|
|
return(err);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
1998-03-28 05:44:41 +03:00
|
|
|
PRBool
|
|
|
|
fsRemoveFile(char *filePathname, PRBool justCheckWriteAccess)
|
|
|
|
{
|
|
|
|
PRBool errFlag = true;
|
|
|
|
|
|
|
|
if (justCheckWriteAccess == true)
|
|
|
|
{
|
|
|
|
errFlag = ((!CallPRWriteAccessFileUsingFileURL(filePathname)) ? false:true);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!CallPRWriteAccessFileUsingFileURL(filePathname))
|
|
|
|
{
|
|
|
|
if (!CallPRDeleteFileUsingFileURL(filePathname))
|
|
|
|
{
|
|
|
|
errFlag = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (errFlag == true)
|
|
|
|
{
|
|
|
|
FE_Alert(((MWContext *)gRDFMWContext()),
|
|
|
|
PR_smprintf(XP_GetString(RDF_UNABLETODELETEFILE),
|
|
|
|
filePathname));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return(errFlag);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
fsRemoveDir(char *filePathname, PRBool justCheckWriteAccess)
|
|
|
|
{
|
|
|
|
PRBool dirFlag, errFlag = false;
|
|
|
|
PRDir *d, *tempD;
|
|
|
|
PRDirEntry *de;
|
|
|
|
char *base, *dirStr, *fileStr;
|
|
|
|
int len, n = PR_SKIP_BOTH;
|
|
|
|
|
|
|
|
if (filePathname == NULL) return(true);
|
|
|
|
if ((d = OpenDir(filePathname)) == NULL) return(true);
|
|
|
|
|
1998-06-03 22:50:29 +04:00
|
|
|
while ((de = PR_ReadDir(d, (PRDirFlags)(n++))) != NULL)
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
|
|
|
base = NET_Escape(de->name, URL_XALPHAS);
|
|
|
|
if (base == NULL) return(true);
|
|
|
|
fileStr = append2Strings(filePathname, base);
|
|
|
|
|
|
|
|
XP_FREE(base);
|
|
|
|
if (fileStr == NULL) return(true);
|
|
|
|
dirFlag = (((tempD = OpenDir(fileStr)) != NULL) ? true:false);
|
|
|
|
if (tempD != NULL)
|
|
|
|
{
|
|
|
|
|
|
|
|
PR_CloseDir(tempD);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dirFlag)
|
|
|
|
{
|
|
|
|
dirStr = append2Strings(fileStr, "/");
|
|
|
|
errFlag = fsRemoveDir(dirStr, justCheckWriteAccess);
|
|
|
|
if (dirStr != NULL) freeMem(dirStr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
errFlag = fsRemoveFile(fileStr, justCheckWriteAccess);
|
|
|
|
}
|
|
|
|
|
|
|
|
freeMem(fileStr);
|
|
|
|
if (errFlag == true) break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PR_CloseDir(d);
|
|
|
|
|
|
|
|
if (errFlag == false)
|
|
|
|
{
|
|
|
|
if ((dirStr = copyString(filePathname)) != NULL)
|
|
|
|
{
|
|
|
|
len = strlen(dirStr)-1;
|
|
|
|
if (dirStr[len] == '/')
|
|
|
|
{
|
|
|
|
dirStr[len] = '\0';
|
|
|
|
}
|
|
|
|
if (justCheckWriteAccess == true)
|
|
|
|
{
|
|
|
|
errFlag = fsRemoveFile(dirStr, justCheckWriteAccess);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
errFlag = (CallPR_RmDirUsingFileURL(dirStr) != 0);
|
|
|
|
|
|
|
|
if (errFlag == true)
|
|
|
|
{
|
|
|
|
FE_Alert(((MWContext *)gRDFMWContext()),
|
|
|
|
PR_smprintf(XP_GetString(RDF_UNABLETODELETEFOLDER),
|
|
|
|
filePathname));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
freeMem(dirStr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return(errFlag);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
fsUnassert (RDFT mcf, RDF_Resource u, RDF_Resource s, void* v, RDF_ValueType type)
|
|
|
|
{
|
|
|
|
char *filePathname;
|
|
|
|
PRBool retVal = false;
|
|
|
|
|
|
|
|
if ((s == gCoreVocab->RDF_parent) && (type == RDF_RESOURCE_TYPE) &&
|
|
|
|
(resourceType(u) == LFS_RT) && (containerp(v)) &&
|
|
|
|
(resourceType((RDF_Resource)v) == LFS_RT) &&
|
|
|
|
(startsWith(resourceID((RDF_Resource)v), resourceID(u))))
|
|
|
|
{
|
|
|
|
filePathname = resourceID((RDF_Resource)u);
|
|
|
|
if (filePathname[strlen(filePathname)-1] == '/')
|
|
|
|
{
|
|
|
|
if (!fsRemoveDir(filePathname, true))
|
|
|
|
{
|
|
|
|
if (!fsRemoveDir(filePathname, false))
|
|
|
|
{
|
|
|
|
retVal = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!fsRemoveFile(filePathname, true))
|
|
|
|
{
|
|
|
|
if (!fsRemoveFile(filePathname, false))
|
|
|
|
{
|
|
|
|
retVal = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (retVal == true)
|
|
|
|
{
|
|
|
|
sendNotifications2(mcf, RDF_DELETE_NOTIFY,
|
|
|
|
u, s, v, type, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* XXX hack: always return true (even if file/dir deletion fails)
|
|
|
|
to prevent an assertion going into the localstore,
|
|
|
|
which would hide a file/dir that still exists */
|
|
|
|
|
|
|
|
retVal = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return(retVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
fsHasAssertion (RDFT rdf, RDF_Resource u, RDF_Resource s, void* v,
|
|
|
|
RDF_ValueType type, PRBool tv)
|
|
|
|
{
|
|
|
|
PRBool ans = 0;
|
|
|
|
PRDir *d;
|
|
|
|
PRDirEntry *de;
|
|
|
|
char *filePathname, *name;
|
|
|
|
int len, n=0;
|
|
|
|
|
|
|
|
if ((s == gCoreVocab->RDF_parent) && (type == RDF_RESOURCE_TYPE) &&
|
|
|
|
(resourceType(u) == LFS_RT) && (containerp(v)) &&
|
|
|
|
(resourceType((RDF_Resource)v) == LFS_RT) &&
|
|
|
|
(startsWith(resourceID((RDF_Resource)v), resourceID(u))))
|
|
|
|
{
|
|
|
|
d = OpenDir(resourceID((RDF_Resource)v));
|
|
|
|
if ((filePathname = copyString(resourceID(u))) == NULL)
|
|
|
|
{
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
len = strlen(filePathname)-1;
|
|
|
|
if (filePathname[len] == '/')
|
|
|
|
{
|
|
|
|
filePathname[len] = '\0';
|
|
|
|
}
|
|
|
|
name = unescapeURL(&filePathname[ 1 + revCharSearch(XP_DIRECTORY_SEPARATOR,
|
|
|
|
filePathname)]);
|
|
|
|
if (name == NULL)
|
|
|
|
{
|
|
|
|
freeMem(filePathname);
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
1998-06-03 22:50:29 +04:00
|
|
|
while ((de = PR_ReadDir(d, (PRDirFlags)(n++))) != NULL)
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
|
|
|
if (strcmp(name, de->name) == 0)
|
|
|
|
{
|
|
|
|
ans = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PR_CloseDir(d);
|
|
|
|
XP_FREE(name);
|
|
|
|
freeMem(filePathname);
|
|
|
|
return ans;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void *
|
|
|
|
fsGetSlotValue (RDFT rdf, RDF_Resource u, RDF_Resource s, RDF_ValueType type, PRBool inversep, PRBool tv)
|
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
PRBool ans = PR_FALSE;
|
|
|
|
PRFileInfo fn;
|
|
|
|
PRStatus err;
|
|
|
|
PRTime oneMillion, dateVal;
|
|
|
|
char buffer[128], *pathname, *url;
|
|
|
|
void *retVal = NULL;
|
|
|
|
int len, n;
|
|
|
|
int32 creationTime, modifyTime;
|
|
|
|
struct tm *time;
|
|
|
|
|
1998-07-23 21:36:59 +04:00
|
|
|
#ifdef XP_MAC
|
|
|
|
FInfo fndrInfo;
|
|
|
|
FSSpec fss;
|
|
|
|
#endif
|
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
if (!startsWith("file://", resourceID(u))) return(NULL);
|
|
|
|
|
|
|
|
if ((s == gCoreVocab->RDF_name) && (type == RDF_STRING_TYPE) && (tv))
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
if ((pathname = copyString(resourceID(u))) != NULL)
|
|
|
|
{
|
|
|
|
if ((len = strlen(pathname)) > 0)
|
|
|
|
{
|
|
|
|
if (pathname[len-1] == '/') pathname[--len] = '\0';
|
|
|
|
n = revCharSearch('/', pathname);
|
|
|
|
retVal = (void *)unescapeURL(&pathname[n+1]);
|
|
|
|
freeMem(pathname);
|
|
|
|
}
|
|
|
|
}
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
else if ((s == gWebData->RDF_size) && (type == RDF_INT_TYPE) && (tv))
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
if ((pathname = resourceID(u)) != NULL)
|
|
|
|
{
|
|
|
|
if ((url = unescapeURL(&pathname[FS_URL_OFFSET])) != NULL)
|
|
|
|
{
|
|
|
|
err=PR_GetFileInfo(url, &fn);
|
|
|
|
if (!err) retVal = (void *)fn.size;
|
|
|
|
XP_FREE(url);
|
|
|
|
}
|
|
|
|
}
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
else if ((s == gWebData->RDF_description) && (type == RDF_STRING_TYPE) && (tv))
|
|
|
|
{
|
|
|
|
if ((pathname = resourceID(u)) != NULL)
|
|
|
|
{
|
|
|
|
if ((url = unescapeURL(&pathname[FS_URL_OFFSET])) != NULL)
|
|
|
|
{
|
|
|
|
err=PR_GetFileInfo(url, &fn);
|
|
|
|
if (!err)
|
|
|
|
{
|
|
|
|
switch(fn.type)
|
|
|
|
{
|
|
|
|
case PR_FILE_FILE:
|
1998-07-23 21:36:59 +04:00
|
|
|
#ifdef XP_MAC
|
|
|
|
if (!nativeMacPathname(pathname, &fss))
|
|
|
|
{
|
|
|
|
if (!FSpGetFInfo(&fss, &fndrInfo))
|
|
|
|
{
|
|
|
|
if (fndrInfo.fdFlags & kIsAlias)
|
|
|
|
{
|
|
|
|
/* XXX localization */
|
|
|
|
retVal = copyString("Alias");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (retVal == NULL)
|
|
|
|
{
|
|
|
|
retVal = (void *)copyString(XP_GetString(RDF_FILE_DESC_STR));
|
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case PR_FILE_DIRECTORY:
|
1998-07-23 21:36:59 +04:00
|
|
|
#ifdef XP_MAC
|
|
|
|
if (!nativeMacPathname(pathname, &fss))
|
|
|
|
{
|
|
|
|
if ((fss.parID == 0) || (fss.parID == 1))
|
|
|
|
{
|
|
|
|
retVal = copyString(XP_GetString(RDF_VOLUME_DESC_STR));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (retVal == NULL)
|
|
|
|
{
|
|
|
|
retVal = (void *)copyString(XP_GetString(RDF_DIRECTORY_DESC_STR));
|
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
XP_FREE(url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ((s == gWebData->RDF_lastModifiedDate) && (tv))
|
|
|
|
{
|
|
|
|
if ((pathname = resourceID(u)) != NULL)
|
|
|
|
{
|
|
|
|
if ((url = unescapeURL(&pathname[FS_URL_OFFSET])) != NULL)
|
|
|
|
{
|
|
|
|
err = PR_GetFileInfo(url, &fn);
|
|
|
|
if (!err)
|
|
|
|
{
|
|
|
|
LL_I2L(oneMillion, PR_USEC_PER_SEC);
|
|
|
|
LL_DIV(dateVal, fn.modifyTime, oneMillion);
|
|
|
|
LL_L2I(modifyTime, dateVal);
|
|
|
|
if (type == RDF_STRING_TYPE)
|
|
|
|
{
|
|
|
|
if ((time = localtime((time_t *) &modifyTime)) != NULL)
|
|
|
|
{
|
|
|
|
#ifdef XP_MAC
|
|
|
|
time->tm_year += 4;
|
|
|
|
strftime(buffer, sizeof(buffer), XP_GetString(RDF_HTML_MACDATE), time);
|
1998-07-10 02:53:25 +04:00
|
|
|
#elif XP_UNIX
|
|
|
|
strftime(buffer, sizeof(buffer), XP_GetString(RDF_HTML_MACDATE), time);
|
1998-06-03 21:35:31 +04:00
|
|
|
#else
|
|
|
|
strftime(buffer, sizeof(buffer), XP_GetString(RDF_HTML_WINDATE), time);
|
|
|
|
#endif
|
|
|
|
retVal = copyString(buffer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (type == RDF_INT_TYPE)
|
|
|
|
{
|
|
|
|
retVal = (void *)modifyTime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
XP_FREE(url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ((s == gWebData->RDF_creationDate) && (tv))
|
|
|
|
{
|
|
|
|
if ((pathname = resourceID(u)) != NULL)
|
|
|
|
{
|
|
|
|
if ((url = unescapeURL(&pathname[FS_URL_OFFSET])) != NULL)
|
|
|
|
{
|
|
|
|
err = PR_GetFileInfo(url, &fn);
|
|
|
|
if (!err)
|
|
|
|
{
|
|
|
|
LL_I2L(oneMillion, PR_USEC_PER_SEC);
|
|
|
|
LL_DIV(dateVal, fn.creationTime, oneMillion);
|
|
|
|
LL_L2I(creationTime, dateVal);
|
|
|
|
if (type == RDF_STRING_TYPE)
|
|
|
|
{
|
|
|
|
if ((time = localtime((time_t *) &creationTime)) != NULL)
|
|
|
|
{
|
|
|
|
#ifdef XP_MAC
|
|
|
|
time->tm_year += 4;
|
|
|
|
strftime(buffer, sizeof(buffer), XP_GetString(RDF_HTML_MACDATE), time);
|
1998-07-10 02:53:25 +04:00
|
|
|
#elif XP_UNIX
|
|
|
|
strftime(buffer, sizeof(buffer), XP_GetString(RDF_HTML_MACDATE), time);
|
1998-06-03 21:35:31 +04:00
|
|
|
#else
|
|
|
|
strftime(buffer, sizeof(buffer), XP_GetString(RDF_HTML_WINDATE), time);
|
|
|
|
#endif
|
|
|
|
retVal = copyString(buffer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (type == RDF_INT_TYPE)
|
|
|
|
{
|
|
|
|
retVal = (void *)creationTime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
XP_FREE(url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return(retVal);
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
fileDirectoryp(RDF_Resource u)
|
|
|
|
{
|
1998-07-23 21:36:59 +04:00
|
|
|
PRFileInfo info;
|
1998-06-03 21:35:31 +04:00
|
|
|
PRBool retVal = PR_FALSE;
|
1998-07-23 21:36:59 +04:00
|
|
|
PRStatus err;
|
|
|
|
char *pathname, *url;
|
1998-06-03 21:35:31 +04:00
|
|
|
|
|
|
|
if (startsWith("file:", resourceID(u)))
|
|
|
|
{
|
1998-07-23 21:36:59 +04:00
|
|
|
if ((pathname = resourceID(u)) != NULL)
|
1998-06-03 21:35:31 +04:00
|
|
|
{
|
1998-07-23 21:36:59 +04:00
|
|
|
if ((url = unescapeURL(&pathname[FS_URL_OFFSET])) != NULL)
|
|
|
|
{
|
|
|
|
if ((err=PR_GetFileInfo(url, &info)) == PR_SUCCESS)
|
|
|
|
{
|
|
|
|
if (info.type == PR_FILE_DIRECTORY)
|
|
|
|
{
|
|
|
|
retVal = PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
XP_FREE(url);
|
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return(retVal);
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RDF_Cursor
|
1998-06-03 21:35:31 +04:00
|
|
|
fsGetSlotValues (RDFT rdf, RDF_Resource u, RDF_Resource s,
|
|
|
|
RDF_ValueType type, PRBool inversep, PRBool tv)
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
PRDir *d = NULL;
|
|
|
|
RDF_Cursor c = NULL;
|
|
|
|
|
|
|
|
if ((((s == gCoreVocab->RDF_child) && (!inversep)) || ((s == gCoreVocab->RDF_parent) && (inversep))) &&
|
|
|
|
(type == RDF_RESOURCE_TYPE) && (tv))
|
|
|
|
{
|
|
|
|
if ((c = getMem(sizeof(struct RDF_CursorStruct))) != NULL)
|
|
|
|
{
|
|
|
|
if (u == gNavCenter->RDF_LocalFiles)
|
|
|
|
{
|
|
|
|
c->u = u;
|
|
|
|
c->s = s;
|
|
|
|
c->type = type;
|
|
|
|
c->count = 0;
|
|
|
|
c->pdata = NULL;
|
|
|
|
}
|
|
|
|
else if (startsWith("file://", resourceID(u)))
|
|
|
|
{
|
|
|
|
if ((d = OpenDir(resourceID(u))) != NULL)
|
|
|
|
{
|
|
|
|
c->u = u;
|
|
|
|
c->s = s;
|
|
|
|
c->type = type;
|
|
|
|
c->count = PR_SKIP_BOTH;
|
|
|
|
c->pdata = d;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
freeMem(c);
|
|
|
|
c = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
freeMem(c);
|
|
|
|
c = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return(c);
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
1998-07-23 21:36:59 +04:00
|
|
|
PRBool
|
|
|
|
isFileVisible(char *fileURL)
|
|
|
|
{
|
|
|
|
PRBool retVal = PR_TRUE;
|
|
|
|
#ifdef XP_MAC
|
|
|
|
FInfo fndrInfo;
|
|
|
|
FSSpec fss;
|
|
|
|
OSErr err;
|
|
|
|
#endif
|
|
|
|
#ifdef XP_WIN
|
|
|
|
char *p;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef XP_MAC
|
|
|
|
if (!(err=nativeMacPathname(fileURL, &fss)))
|
|
|
|
{
|
|
|
|
if (!(err = FSpGetFInfo(&fss, &fndrInfo)))
|
|
|
|
{
|
|
|
|
if (fndrInfo.fdFlags & kIsInvisible)
|
|
|
|
{
|
|
|
|
retVal = PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef XP_WIN
|
|
|
|
if ((p = strrchr(fileURL, '/')) != NULL)
|
|
|
|
{
|
|
|
|
++p;
|
|
|
|
if ((!strcmp(p, ".")) || (!strcmp(p, "..")))
|
|
|
|
{
|
|
|
|
retVal = PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return(retVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
1998-03-28 05:44:41 +03:00
|
|
|
void *
|
|
|
|
fsNextValue (RDFT rdf, RDF_Cursor c)
|
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
PRBool isDirectoryFlag = false, sep;
|
|
|
|
PRDirEntry *de;
|
|
|
|
PRFileInfo fn;
|
|
|
|
RDF_Resource vol;
|
|
|
|
char *base, *encoded = NULL, *url, *url2;
|
|
|
|
void *retVal = NULL;
|
1998-03-28 05:44:41 +03:00
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
XP_ASSERT(c != NULL);
|
|
|
|
if (c == NULL) return(NULL);
|
|
|
|
if (c->type != RDF_RESOURCE_TYPE) return(NULL);
|
|
|
|
|
|
|
|
if (c->u == gNavCenter->RDF_LocalFiles)
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if ((url = getVolume(c->count++, PR_FALSE)) != NULL)
|
|
|
|
{
|
|
|
|
if ((vol = RDF_GetResource(NULL, url, 1)) != NULL)
|
|
|
|
{
|
|
|
|
setContainerp(vol, 1);
|
|
|
|
setResourceType(vol, LFS_RT);
|
|
|
|
retVal = (void *)vol;
|
|
|
|
}
|
|
|
|
XP_FREE(url);
|
|
|
|
}
|
|
|
|
} while((retVal == NULL) && (c->count <= 26));
|
|
|
|
}
|
|
|
|
else if (c->pdata != NULL)
|
|
|
|
{
|
1998-06-03 22:50:29 +04:00
|
|
|
while ((de = PR_ReadDir((PRDir*)c->pdata, (PRDirFlags)(c->count++))) != NULL)
|
1998-06-03 21:35:31 +04:00
|
|
|
{
|
|
|
|
if ((base = NET_Escape(de->name, URL_XALPHAS)) != NULL) /* URL_PATH */
|
|
|
|
{
|
|
|
|
sep = ((resourceID(c->u))[strlen(resourceID(c->u))-1] == XP_DIRECTORY_SEPARATOR);
|
|
|
|
if (sep)
|
|
|
|
{
|
|
|
|
url = PR_smprintf("%s%s", resourceID(c->u), base);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
url = PR_smprintf("%s/%s", resourceID(c->u), base);
|
|
|
|
}
|
|
|
|
XP_FREE(base);
|
1998-03-28 05:44:41 +03:00
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
if (url != NULL)
|
|
|
|
{
|
|
|
|
encoded = unescapeURL(&url[FS_URL_OFFSET]);
|
|
|
|
if (encoded != NULL)
|
|
|
|
{
|
1998-03-28 05:44:41 +03:00
|
|
|
#ifdef XP_WIN
|
1998-06-03 21:35:31 +04:00
|
|
|
if (encoded[1] == '|') encoded[1] = ':';
|
1998-03-28 05:44:41 +03:00
|
|
|
#endif
|
1998-06-03 21:35:31 +04:00
|
|
|
PR_GetFileInfo(encoded, &fn);
|
|
|
|
if (fn.type == PR_FILE_DIRECTORY)
|
|
|
|
{
|
|
|
|
isDirectoryFlag = TRUE;
|
|
|
|
url2 = PR_smprintf("%s/", url);
|
|
|
|
XP_FREE(url);
|
|
|
|
url = url2;
|
|
|
|
}
|
|
|
|
freeMem(encoded);
|
|
|
|
}
|
1998-07-23 21:36:59 +04:00
|
|
|
if (isFileVisible(url) == PR_FALSE)
|
1998-06-03 21:35:31 +04:00
|
|
|
{
|
|
|
|
XP_FREE(url);
|
|
|
|
url = NULL;
|
|
|
|
}
|
|
|
|
if (url != NULL)
|
|
|
|
{
|
|
|
|
retVal = (void *)CreateFSUnit(url, isDirectoryFlag);
|
|
|
|
XP_FREE(url);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
1998-06-03 21:35:31 +04:00
|
|
|
|
|
|
|
}
|
|
|
|
if (de == NULL)
|
|
|
|
{
|
|
|
|
PR_CloseDir((PRDir*)c->pdata);
|
|
|
|
c->pdata = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return(retVal);
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RDF_Error
|
|
|
|
fsDisposeCursor (RDFT rdf, RDF_Cursor c)
|
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
XP_ASSERT(c != NULL);
|
|
|
|
|
|
|
|
if (c != NULL)
|
|
|
|
{
|
|
|
|
if (c->pdata != NULL)
|
|
|
|
{
|
|
|
|
PR_CloseDir((PRDir*)c->pdata);
|
|
|
|
c->pdata = NULL;
|
|
|
|
}
|
|
|
|
freeMem(c);
|
|
|
|
}
|
|
|
|
return 0;
|
1998-03-28 05:44:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RDF_Resource
|
1998-06-03 21:35:31 +04:00
|
|
|
CreateFSUnit (char *nname, PRBool isDirectoryFlag)
|
1998-03-28 05:44:41 +03:00
|
|
|
{
|
1998-06-03 21:35:31 +04:00
|
|
|
RDF_Resource r = NULL;
|
1998-03-28 05:44:41 +03:00
|
|
|
|
1998-06-03 21:35:31 +04:00
|
|
|
if (startsWith("file:///", nname))
|
|
|
|
{
|
1998-07-04 23:13:55 +04:00
|
|
|
if ((r =(RDF_Resource)PL_HashTableLookup(resourceHash, nname)) == NULL)
|
1998-06-03 21:35:31 +04:00
|
|
|
{
|
1998-07-04 23:13:55 +04:00
|
|
|
if ((r = NewRDFResource(nname)) != NULL)
|
1998-06-03 21:35:31 +04:00
|
|
|
{
|
|
|
|
setResourceType(r, LFS_RT);
|
|
|
|
setContainerp(r, isDirectoryFlag);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return(r);
|
1998-07-04 23:13:55 +04:00
|
|
|
}
|