зеркало из https://github.com/mozilla/pjs.git
fixing bug #55253 - Browser cannot launch after update.html from Win 9x only. sr=brendan,warren moa=dveditz r=dveditz,sgehani. Checking in only to the trunk for QA testing. Will check in to the BRANCH after QA certifies OK.
This commit is contained in:
Родитель
6c7652a9a1
Коммит
87e4f0d2e8
|
@ -1973,6 +1973,63 @@ nsInstall::FileOpFileRename(nsInstallFolder& aSrc, nsString& aTarget, PRInt32* a
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
#include <winbase.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
PRInt32
|
||||||
|
nsInstall::FileOpFileWindowsGetShortName(nsInstallFolder& aTarget, nsString& aShortPathName)
|
||||||
|
{
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
|
||||||
|
PRInt32 err;
|
||||||
|
PRBool flagExists;
|
||||||
|
nsString tmpNsString;
|
||||||
|
nsXPIDLCString nativeTargetPath;
|
||||||
|
char nativeShortPathName[MAX_PATH];
|
||||||
|
nsCOMPtr<nsIFile> localTarget(aTarget.GetFileSpec());
|
||||||
|
|
||||||
|
if(localTarget == nsnull)
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
localTarget->Exists(&flagExists);
|
||||||
|
if(flagExists)
|
||||||
|
{
|
||||||
|
memset(nativeShortPathName, 0, MAX_PATH);
|
||||||
|
localTarget->GetPath(getter_Copies(nativeTargetPath));
|
||||||
|
|
||||||
|
err = GetShortPathName(nativeTargetPath, nativeShortPathName, MAX_PATH);
|
||||||
|
if((err > 0) && (*nativeShortPathName == '\0'))
|
||||||
|
{
|
||||||
|
// NativeShortPathName buffer not big enough.
|
||||||
|
// Reallocate and try again.
|
||||||
|
// err will have the required size.
|
||||||
|
char *nativeShortPathNameTmp = new char[err + 1];
|
||||||
|
if(nativeShortPathNameTmp == nsnull)
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
err = GetShortPathName(nativeTargetPath, nativeShortPathNameTmp, err + 1);
|
||||||
|
// Is it safe to assume that the second time around the buffer is big enough
|
||||||
|
// and not to worry about it unless it's a different problem?
|
||||||
|
|
||||||
|
// if err is 0, it's not a buffer size problem. It's something else unexpected.
|
||||||
|
if(err != 0)
|
||||||
|
aShortPathName.AssignWithConversion(nativeShortPathNameTmp);
|
||||||
|
|
||||||
|
if(nativeShortPathNameTmp)
|
||||||
|
delete [] nativeShortPathNameTmp;
|
||||||
|
}
|
||||||
|
else if(err != 0)
|
||||||
|
// if err is 0, it's not a buffer size problem. It's something else unexpected.
|
||||||
|
aShortPathName.AssignWithConversion(nativeShortPathName);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
PRInt32
|
PRInt32
|
||||||
nsInstall::FileOpFileWindowsShortcut(nsIFile* aTarget, nsIFile* aShortcutPath, nsString& aDescription, nsIFile* aWorkingPath, nsString& aParams, nsIFile* aIcon, PRInt32 aIconId, PRInt32* aReturn)
|
nsInstall::FileOpFileWindowsShortcut(nsIFile* aTarget, nsIFile* aShortcutPath, nsString& aDescription, nsIFile* aWorkingPath, nsString& aParams, nsIFile* aIcon, PRInt32 aIconId, PRInt32* aReturn)
|
||||||
{
|
{
|
||||||
|
|
|
@ -252,6 +252,7 @@ class nsInstall
|
||||||
PRInt32 FileOpFileModDateChanged(nsInstallFolder& aTarget, double aOldStamp, PRBool* aReturn);
|
PRInt32 FileOpFileModDateChanged(nsInstallFolder& aTarget, double aOldStamp, PRBool* aReturn);
|
||||||
PRInt32 FileOpFileMove(nsInstallFolder& aSrc, nsInstallFolder& aTarget, PRInt32* aReturn);
|
PRInt32 FileOpFileMove(nsInstallFolder& aSrc, nsInstallFolder& aTarget, PRInt32* aReturn);
|
||||||
PRInt32 FileOpFileRename(nsInstallFolder& aSrc, nsString& aTarget, PRInt32* aReturn);
|
PRInt32 FileOpFileRename(nsInstallFolder& aSrc, nsString& aTarget, PRInt32* aReturn);
|
||||||
|
PRInt32 FileOpFileWindowsGetShortName(nsInstallFolder& aTarget, nsString& aShortPathName);
|
||||||
PRInt32 FileOpFileWindowsShortcut(nsIFile* aTarget, nsIFile* aShortcutPath, nsString& aDescription, nsIFile* aWorkingPath, nsString& aParams, nsIFile* aIcon, PRInt32 aIconId, PRInt32* aReturn);
|
PRInt32 FileOpFileWindowsShortcut(nsIFile* aTarget, nsIFile* aShortcutPath, nsString& aDescription, nsIFile* aWorkingPath, nsString& aParams, nsIFile* aIcon, PRInt32 aIconId, PRInt32* aReturn);
|
||||||
PRInt32 FileOpFileMacAlias(nsIFile *aSourceFile, nsIFile *aAliasFile, PRInt32* aReturn);
|
PRInt32 FileOpFileMacAlias(nsIFile *aSourceFile, nsIFile *aAliasFile, PRInt32* aReturn);
|
||||||
PRInt32 FileOpFileUnixLink(nsInstallFolder& aTarget, PRInt32 aFlags, PRInt32* aReturn);
|
PRInt32 FileOpFileUnixLink(nsInstallFolder& aTarget, PRInt32 aFlags, PRInt32* aReturn);
|
||||||
|
|
|
@ -991,6 +991,54 @@ InstallFileOpFileRename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, j
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Native method FileWindowsGetShortName
|
||||||
|
//
|
||||||
|
JSBool PR_CALLBACK
|
||||||
|
InstallFileOpFileWindowsGetShortName(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||||
|
{
|
||||||
|
nsAutoString shortPathName;
|
||||||
|
nsInstall* nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
|
||||||
|
JSObject *jsObj;
|
||||||
|
nsInstallFolder *longPathName;
|
||||||
|
|
||||||
|
*rval = JSVAL_NULL;
|
||||||
|
|
||||||
|
// If there's no private data, this must be the prototype, so ignore
|
||||||
|
if(nsnull == nativeThis)
|
||||||
|
{
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// public String windowsGetShortName (File NativeFolderPath);
|
||||||
|
|
||||||
|
if ( argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval
|
||||||
|
{
|
||||||
|
// error, return NULL
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
jsObj = JSVAL_TO_OBJECT(argv[0]);
|
||||||
|
|
||||||
|
if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull))
|
||||||
|
{
|
||||||
|
// error, return NULL
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
longPathName = (nsInstallFolder*)JS_GetPrivate(cx, jsObj);
|
||||||
|
|
||||||
|
if(!longPathName || NS_OK != nativeThis->FileOpFileWindowsGetShortName(*longPathName, shortPathName))
|
||||||
|
{
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(shortPathName.Length() != 0)
|
||||||
|
*rval = STRING_TO_JSVAL(JS_NewUCStringCopyN(cx, NS_STATIC_CAST(const jschar*, shortPathName.GetUnicode()), shortPathName.Length()));
|
||||||
|
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Native method FileWindowsShortcut
|
// Native method FileWindowsShortcut
|
||||||
//
|
//
|
||||||
|
@ -1362,6 +1410,7 @@ static JSFunctionSpec FileOpMethods[] =
|
||||||
{"modDateChanged", InstallFileOpFileModDateChanged, 2},
|
{"modDateChanged", InstallFileOpFileModDateChanged, 2},
|
||||||
{"move", InstallFileOpFileMove, 2},
|
{"move", InstallFileOpFileMove, 2},
|
||||||
{"rename", InstallFileOpFileRename, 2},
|
{"rename", InstallFileOpFileRename, 2},
|
||||||
|
{"windowsGetShortName", InstallFileOpFileWindowsGetShortName, 1},
|
||||||
{"windowsShortcut", InstallFileOpFileWindowsShortcut, 7},
|
{"windowsShortcut", InstallFileOpFileWindowsShortcut, 7},
|
||||||
{"macAlias", InstallFileOpFileMacAlias, 2},
|
{"macAlias", InstallFileOpFileMacAlias, 2},
|
||||||
{"unixLink", InstallFileOpFileUnixLink, 2},
|
{"unixLink", InstallFileOpFileUnixLink, 2},
|
||||||
|
|
Загрузка…
Ссылка в новой задаче