mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-21 17:59:34 +00:00
Bug 56295 - doesn't work for file names > 31 chars. r=sdagley/sr=sfraser
This commit is contained in:
parent
cef23c2b9c
commit
4740373b28
@ -56,6 +56,7 @@
|
||||
#include <Script.h>
|
||||
#include <Processes.h>
|
||||
#include <StringCompare.h>
|
||||
#include <Resources.h>
|
||||
|
||||
#include <AppleEvents.h>
|
||||
#include <AEDataModel.h>
|
||||
@ -452,6 +453,62 @@ static void myPLstrncpy(Str255 dst, const char* src, int inMax)
|
||||
memcpy(&dst[1], src, srcLength);
|
||||
}
|
||||
|
||||
static const char* TruncNodeName(const char *aNode, char *outBuf)
|
||||
{
|
||||
PRUint32 nodeLen;
|
||||
if ((nodeLen = nsCRT::strlen(aNode)) > 31)
|
||||
{
|
||||
static PRBool sInitialized = PR_FALSE;
|
||||
static CharByteTable sTable;
|
||||
// Init to "..." in case we fail to get the ellipsis token
|
||||
static char sEllipsisTokenStr[4] = { '.', '.', '.', 0 };
|
||||
static PRUint8 sEllipsisTokenLen = 3;
|
||||
|
||||
if (!sInitialized)
|
||||
{
|
||||
// Entries in the table are:
|
||||
// 0 == 1 byte char
|
||||
// 1 == 2 byte char
|
||||
FillParseTable(sTable, smSystemScript);
|
||||
|
||||
Handle itl4ResHandle = nsnull;
|
||||
long offset, len;
|
||||
::GetIntlResourceTable(smSystemScript, smUnTokenTable, &itl4ResHandle, &offset, &len);
|
||||
if (itl4ResHandle)
|
||||
{
|
||||
UntokenTable *untokenTableRec = (UntokenTable *)(*itl4ResHandle + offset);
|
||||
if (untokenTableRec->lastToken >= tokenEllipsis)
|
||||
{
|
||||
offset += untokenTableRec->index[tokenEllipsis];
|
||||
char *tokenStr = (*itl4ResHandle + offset);
|
||||
sEllipsisTokenLen = tokenStr[0];
|
||||
memcpy(sEllipsisTokenStr, &tokenStr[1], sEllipsisTokenLen);
|
||||
}
|
||||
::ReleaseResource(itl4ResHandle);
|
||||
}
|
||||
sInitialized = PR_TRUE;
|
||||
}
|
||||
|
||||
PRInt32 halfLen = (31 - sEllipsisTokenLen) / 2;
|
||||
PRInt32 charSize = 0, srcPos, destPos;
|
||||
for (srcPos = 0; srcPos + charSize <= halfLen; srcPos += charSize)
|
||||
charSize = sTable[aNode[srcPos]] ? 2 : 1;
|
||||
|
||||
memcpy(outBuf, aNode, srcPos);
|
||||
memcpy(outBuf + srcPos, sEllipsisTokenStr, sEllipsisTokenLen);
|
||||
destPos = srcPos + sEllipsisTokenLen;
|
||||
|
||||
for (; srcPos <= nodeLen - halfLen; srcPos += charSize)
|
||||
charSize = sTable[aNode[srcPos]] ? 2 : 1;
|
||||
|
||||
memcpy(outBuf + destPos, aNode + srcPos, nodeLen - srcPos);
|
||||
destPos += (nodeLen - srcPos);
|
||||
outBuf[destPos] = '\0';
|
||||
return outBuf;
|
||||
}
|
||||
return aNode;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
// The R**co FSSpec resolver -
|
||||
@ -1320,13 +1377,17 @@ nsLocalFile::Create(PRUint32 type, PRUint32 attributes)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLocalFile::Append(const char *node)
|
||||
nsLocalFile::Append(const char *aNode)
|
||||
{
|
||||
NS_ENSURE_ARG(node);
|
||||
if (strchr(node, ':'))
|
||||
NS_ENSURE_ARG(aNode);
|
||||
if (strchr(aNode, ':'))
|
||||
return NS_ERROR_FILE_UNRECOGNIZED_PATH;
|
||||
|
||||
MakeDirty();
|
||||
|
||||
char truncBuffer[32];
|
||||
const char *node = TruncNodeName(aNode, truncBuffer);
|
||||
|
||||
if (!mAppendedPath.Length())
|
||||
{
|
||||
OSErr err;
|
||||
@ -1342,11 +1403,13 @@ nsLocalFile::Append(const char *node)
|
||||
if ((err = ::FSpGetDirectoryID(&mSpec, &dirID, &isDir)) != noErr)
|
||||
return MacErrorMapper(err);
|
||||
|
||||
FSSpec childSpec;
|
||||
Str255 pascalNode;
|
||||
myPLstrcpy(pascalNode, node);
|
||||
err = ::FSMakeFSSpec(mSpec.vRefNum, dirID, pascalNode, &mSpec);
|
||||
err = ::FSMakeFSSpec(mSpec.vRefNum, dirID, pascalNode, &childSpec);
|
||||
if (err && err != fnfErr)
|
||||
return MacErrorMapper(err);
|
||||
mSpec = childSpec;
|
||||
}
|
||||
else if (err == fnfErr)
|
||||
mAppendedPath.Assign(node);
|
||||
@ -1427,6 +1490,9 @@ nsLocalFile::SetLeafName(const char * aLeafName)
|
||||
|
||||
MakeDirty();
|
||||
|
||||
char truncBuffer[32];
|
||||
const char *leafName = TruncNodeName(aLeafName, truncBuffer);
|
||||
|
||||
if (mAppendedPath.Length())
|
||||
{ // Lop off the end of the appended path and replace it with the new leaf name
|
||||
PRInt32 offset = mAppendedPath.RFindChar(':');
|
||||
@ -1434,12 +1500,12 @@ nsLocalFile::SetLeafName(const char * aLeafName)
|
||||
{
|
||||
mAppendedPath.Truncate(offset + 1);
|
||||
}
|
||||
mAppendedPath.Append(aLeafName);
|
||||
mAppendedPath.Append(leafName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We don't have an appended path so directly modify the FSSpec
|
||||
myPLstrcpy(mSpec.name, aLeafName);
|
||||
myPLstrcpy(mSpec.name, leafName);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
Loading…
x
Reference in New Issue
Block a user