388 lines
11 KiB
C
388 lines
11 KiB
C
/* -*- 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.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
|
|
#include "pluginIncludes.h"
|
|
|
|
extern OSErr getProfileDirectory( FSSpecPtr theFSSpecPtr )
|
|
{
|
|
AliasHandle aliasH;
|
|
Boolean wasChanged;
|
|
CInfoPBRec cBlock;
|
|
OSErr err = paramErr;
|
|
short profileID, refNum, saveResFile;
|
|
|
|
if ( theFSSpecPtr )
|
|
{
|
|
if ( !( err = findNetscapeUserProfileDatabase( theFSSpecPtr ) ) )
|
|
{
|
|
saveResFile = CurResFile();
|
|
if ( ( refNum = FSpOpenResFile( theFSSpecPtr, fsRdWrPerm ) ) != kResFileNotOpened )
|
|
{
|
|
UseResFile( refNum );
|
|
if ( !( err = findCurrentUserProfileID( refNum, &profileID ) ) )
|
|
{
|
|
if ( aliasH = (AliasHandle)Get1Resource( rAliasType, profileID ) )
|
|
{
|
|
HNoPurge( (Handle)aliasH );
|
|
if ( !( err = ResolveAlias( NULL, aliasH, theFSSpecPtr, &wasChanged ) ) )
|
|
{
|
|
bzero( (char*)&cBlock, sizeof( cBlock ) );
|
|
cBlock.hFileInfo.ioCompletion = NULL;
|
|
cBlock.hFileInfo.ioNamePtr = (StringPtr)theFSSpecPtr->name;
|
|
cBlock.hFileInfo.ioVRefNum = theFSSpecPtr->vRefNum;
|
|
cBlock.hFileInfo.ioDirID = theFSSpecPtr->parID;
|
|
cBlock.hFileInfo.ioFDirIndex = 0;
|
|
if ( !( err = PBGetCatInfoSync( &cBlock ) ) )
|
|
{
|
|
// XXX should verify that its a directory (i.e. not a file)
|
|
|
|
theFSSpecPtr->vRefNum = cBlock.hFileInfo.ioVRefNum;
|
|
theFSSpecPtr->parID = cBlock.hFileInfo.ioDirID;
|
|
theFSSpecPtr->name[ 0 ] = 0;
|
|
}
|
|
else
|
|
{
|
|
SETUP_PLUGIN_ERROR( "\p getProfileDirectory: PBGetCatInfoSync error;g", err );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
CloseResFile( refNum );
|
|
}
|
|
UseResFile( saveResFile );
|
|
}
|
|
}
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
extern JRI_PUBLIC_API(struct java_lang_String*) native_SetupPlugin_SECURE_0005fGetCurrentProfileDirectory(
|
|
JRIEnv* env, struct SetupPlugin* self)
|
|
{
|
|
AliasHandle aliasH;
|
|
Boolean wasChanged;
|
|
FSSpec userProfileFSSpec, currentProfileFSSpec;
|
|
Handle h;
|
|
OSErr err;
|
|
java_lang_String* profileDir = NULL;
|
|
short profileID, refNum, saveResFile;
|
|
|
|
SETUP_PLUGIN_TRACE( "\p native_SetupPlugin_GetCurrentProfileDirectory entered" );
|
|
|
|
useCursor( watchCursor );
|
|
|
|
if ( !( err = findNetscapeUserProfileDatabase( &userProfileFSSpec ) ) )
|
|
{
|
|
saveResFile = CurResFile();
|
|
if ( ( refNum = FSpOpenResFile( &userProfileFSSpec, fsRdWrPerm ) ) != kResFileNotOpened )
|
|
{
|
|
UseResFile( refNum );
|
|
if ( !( err = findCurrentUserProfileID( refNum, &profileID ) ) )
|
|
{
|
|
if ( aliasH = (AliasHandle)Get1Resource( rAliasType, profileID ) )
|
|
{
|
|
HNoPurge( (Handle)aliasH );
|
|
if ( !( err = ResolveAlias( NULL, aliasH, ¤tProfileFSSpec, &wasChanged ) ) )
|
|
{
|
|
if ( h = pathFromFSSpec( ¤tProfileFSSpec ) )
|
|
{
|
|
HLock( h );
|
|
// profileDir=JRI_NewStringUTF(env, (char *)(*h), (unsigned)GetHandleSize(h));
|
|
profileDir = cStr2javaLangString( env, (char*)(*h), (unsigned)GetHandleSize( h ) );
|
|
DisposeHandle( h );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
CloseResFile( refNum );
|
|
}
|
|
else
|
|
SETUP_PLUGIN_ERROR( "\p GetCurrentProfileDirectory: FSpOpenResFile error;g", ResError() );
|
|
UseResFile( saveResFile );
|
|
}
|
|
else
|
|
SETUP_PLUGIN_ERROR( "\p GetCurrentProfileDirectory: findNetscapeUserProfileDatabase error;g", err );
|
|
|
|
SETUP_PLUGIN_TRACE( "\p native_SetupPlugin_GetCurrentProfileDirectory exiting" );
|
|
return profileDir;
|
|
}
|
|
|
|
|
|
|
|
extern JRI_PUBLIC_API(struct java_lang_String *)
|
|
native_SetupPlugin_SECURE_0005fGetCurrentProfileName(JRIEnv* env,
|
|
struct SetupPlugin* self)
|
|
{
|
|
FSSpec userProfileFSSpec;
|
|
OSErr err;
|
|
StringHandle strH;
|
|
java_lang_String *profileName=NULL;
|
|
short profileID,refNum,saveResFile;
|
|
|
|
SETUP_PLUGIN_TRACE("\p native_SetupPlugin_GetCurrentProfileName entered");
|
|
|
|
useCursor(watchCursor);
|
|
|
|
if (!(err=findNetscapeUserProfileDatabase(&userProfileFSSpec))) {
|
|
saveResFile = CurResFile();
|
|
if ((refNum=FSpOpenResFile(&userProfileFSSpec, fsRdWrPerm)) != kResFileNotOpened) {
|
|
UseResFile(refNum);
|
|
if (!(err=findCurrentUserProfileID(refNum, &profileID))) {
|
|
if (strH=GetString(profileID)) {
|
|
HLock((Handle)strH);
|
|
// profileName=JRI_NewStringUTF(env, (char *)&((*strH)[1]), (unsigned)((*strH)[0]));
|
|
profileName=cStr2javaLangString(env, (char *)&((*strH)[1]), (unsigned)((*strH)[0]));
|
|
ReleaseResource((Handle)strH);
|
|
}
|
|
}
|
|
CloseResFile(refNum);
|
|
}
|
|
UseResFile(saveResFile);
|
|
}
|
|
else {
|
|
SETUP_PLUGIN_ERROR("\p GetCurrentProfileName: findNetscapeUserProfileDatabase error;g", err);
|
|
}
|
|
|
|
SETUP_PLUGIN_TRACE("\p native_SetupPlugin_GetCurrentProfileName exiting");
|
|
return(profileName);
|
|
}
|
|
|
|
|
|
|
|
extern JRI_PUBLIC_API(void)
|
|
native_SetupPlugin_SECURE_0005fSetCurrentProfileName(JRIEnv* env,
|
|
struct SetupPlugin* self,
|
|
struct java_lang_String *profileName)
|
|
{
|
|
FSSpec userProfileFSSpec;
|
|
OSErr err;
|
|
StringHandle strH;
|
|
const char *profileStr;
|
|
short profileID,refNum,saveResFile;
|
|
int len;
|
|
|
|
SETUP_PLUGIN_TRACE("\p native_SetupPlugin_SetCurrentProfileName entered");
|
|
|
|
if (profileName==NULL) return;
|
|
profileStr = javaLangString2Cstr( env, profileName );
|
|
if (profileStr==NULL) return;
|
|
len=strlen(profileStr);
|
|
if (len==0) return;
|
|
|
|
useCursor(watchCursor);
|
|
|
|
if (!(err=findNetscapeUserProfileDatabase(&userProfileFSSpec))) {
|
|
saveResFile = CurResFile();
|
|
if ((refNum=FSpOpenResFile(&userProfileFSSpec, fsRdWrPerm)) != kResFileNotOpened) {
|
|
UseResFile(refNum);
|
|
if (!(err=findCurrentUserProfileID(refNum, &profileID))) {
|
|
if (strH=GetString(profileID)) {
|
|
HNoPurge((Handle)strH);
|
|
HUnlock((Handle)strH);
|
|
SetHandleSize((Handle)strH,1L+len);
|
|
if (GetHandleSize((Handle)strH) == 1L+len) {
|
|
HLock((Handle)strH);
|
|
(*strH)[0] = (unsigned)len;
|
|
BlockMove(profileStr,&(*strH)[1],len);
|
|
ChangedResource((Handle)strH);
|
|
WriteResource((Handle)strH);
|
|
}
|
|
}
|
|
}
|
|
CloseResFile(refNum);
|
|
}
|
|
UseResFile(saveResFile);
|
|
}
|
|
else {
|
|
SETUP_PLUGIN_ERROR("\p SetCurrentProfileName: findNetscapeUserProfileDatabase error;g", err);
|
|
}
|
|
|
|
SETUP_PLUGIN_TRACE("\p native_SetupPlugin_SetCurrentProfileName exiting");
|
|
}
|
|
|
|
|
|
|
|
OSErr findNetscapeUserProfileDatabase( FSSpecPtr theFSSpecPtr )
|
|
{
|
|
OSErr err;
|
|
short vRefNum;
|
|
long dirID;
|
|
|
|
if ( !( err = FindFolder( kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder, &vRefNum, &dirID ) ) )
|
|
{
|
|
err = FSMakeFSSpec( vRefNum, dirID, USERPROFILEDATABASE_NAME_POSTB2, theFSSpecPtr );
|
|
|
|
// Note: FSMakeFSSpec can return fnfErr (documented) or dirNFErr (not documented) if file/dir/dir-in-path doesn't exist
|
|
|
|
if ( ( err==fnfErr ) || ( err==dirNFErr ) )
|
|
{
|
|
SETUP_PLUGIN_INFO_STR( "\p findNetscapeUserProfileDatabase: B2 fallback for User Profile database location", NULL );
|
|
err = FSMakeFSSpec( vRefNum, dirID, USERPROFILEDATABASE_NAME_B2, theFSSpecPtr );
|
|
}
|
|
}
|
|
return err;
|
|
}
|
|
|
|
OSErr findCurrentUserProfileID( short refNum, short* profileID )
|
|
{
|
|
Handle h;
|
|
OSErr err = paramErr;
|
|
ResType theType;
|
|
Str255 resName;
|
|
short saveResFile, theCount;
|
|
|
|
saveResFile = CurResFile();
|
|
UseResFile( refNum );
|
|
if ( h = Get1Resource( USERPROFILE_RESTYPE, USERPROFILE_RESID ) )
|
|
{
|
|
if ( GetHandleSize( h ) == sizeof( short ) )
|
|
{
|
|
BlockMove( *h, profileID, (long)sizeof( short ) );
|
|
err = noErr;
|
|
}
|
|
else
|
|
{
|
|
SETUP_PLUGIN_ERROR( "\p findCurrentUserProfileID: user profile resource is incorrect size error;g", err );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( ( theCount = Count1Resources( rAliasType ) ) == 1 )
|
|
{
|
|
if ( h = Get1IndResource( rAliasType, 1 ) )
|
|
{
|
|
HNoPurge( h );
|
|
GetResInfo( h, profileID, &theType, resName );
|
|
err = noErr;
|
|
}
|
|
}
|
|
}
|
|
UseResFile( saveResFile );
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
Handle pathFromFSSpec( FSSpecPtr theFSSpecPtr )
|
|
{
|
|
CInfoPBRec cBlock;
|
|
Handle h = NULL;
|
|
OSErr err;
|
|
Str255 name = { 0 };
|
|
long initialLen = 0L, namelen, hlen;
|
|
|
|
if ( theFSSpecPtr == NULL )
|
|
return NULL;
|
|
|
|
// start with cBlock.dirInfo.ioDrDirID
|
|
bzero( (char*)&cBlock, sizeof( cBlock ) );
|
|
cBlock.dirInfo.ioCompletion = NULL;
|
|
cBlock.dirInfo.ioNamePtr = theFSSpecPtr->name;
|
|
cBlock.dirInfo.ioVRefNum = theFSSpecPtr->vRefNum;
|
|
cBlock.dirInfo.ioDrDirID = theFSSpecPtr->parID;
|
|
cBlock.dirInfo.ioFDirIndex = 0;
|
|
if ( err = PBGetCatInfoSync( &cBlock ) )
|
|
{
|
|
SETUP_PLUGIN_ERROR( "\p pathFromFSSpec: PBGetCatInfoSync error;g", err );
|
|
return NULL;
|
|
}
|
|
|
|
|
|
// ¥ the FSSpec is pointing to a file, so copy the name
|
|
if ( !( cBlock.dirInfo.ioFlAttrib & ioDirMask ) )
|
|
{
|
|
SETUP_PLUGIN_INFO_STR( "\p PBGetCatInfoSync: file specified", NULL );
|
|
initialLen = (unsigned)theFSSpecPtr->name[ 0 ] + 1;
|
|
cBlock.dirInfo.ioDrDirID = theFSSpecPtr->parID;
|
|
}
|
|
// ¥Êthe FSSpec is a directory, we'll fetch the name in a sec, but copy in the
|
|
// following "/" first
|
|
else
|
|
{
|
|
initialLen = 1;
|
|
SETUP_PLUGIN_INFO_STR( "\p PBGetCatInfoSync: folder specified", NULL );
|
|
}
|
|
|
|
h = NewHandle( initialLen );
|
|
if ( h == NULL )
|
|
{
|
|
SETUP_PLUGIN_ERROR( "\p pathFromFSSpec: NewHandle error;g", MemError() );
|
|
return NULL;
|
|
}
|
|
|
|
HNoPurge( h );
|
|
|
|
(*h)[ 0 ] = '/';
|
|
|
|
if ( initialLen > 1 )
|
|
// ¥Êcopy the file name into the handle
|
|
BlockMove( &theFSSpecPtr->name[ 1 ], &(*h)[ 1 ],(unsigned long)( theFSSpecPtr->name[ 0 ] ) );
|
|
|
|
|
|
// ¥ start with cBlock.dirInfo.ioDrDirID
|
|
cBlock.dirInfo.ioNamePtr = (StringPtr)name;
|
|
cBlock.dirInfo.ioFDirIndex = -1;
|
|
|
|
while( !( err = PBGetCatInfoSync( &cBlock ) ) )
|
|
{
|
|
|
|
SETUP_PLUGIN_INFO_STR( "\p pathFromFSSpec: parent is;g", cBlock.dirInfo.ioNamePtr );
|
|
|
|
PtoCstr( name );
|
|
namelen = strlen( (void*)name );
|
|
hlen = GetHandleSize( h );
|
|
HUnlock( h );
|
|
SetHandleSize( h, namelen + hlen + 1 );
|
|
if ( GetHandleSize( h ) != ( namelen + hlen + 1 ) )
|
|
{
|
|
err = ( err = MemError() ) ? err : -1;
|
|
SETUP_PLUGIN_ERROR( "\p pathFromFSSpec: SetHandleSize error;g", err );
|
|
break;
|
|
}
|
|
HLock( h );
|
|
|
|
// prepend name and a colon onto handle
|
|
if ( hlen )
|
|
BlockMove( &(*h)[ 1 ], &(*h)[ namelen + 2 ], hlen );
|
|
BlockMove( name, &(*h)[ 1 ], namelen );
|
|
(*h)[ namelen + 1 ] = '/';
|
|
|
|
// stop when at root, else move up to parent directory
|
|
if ( cBlock.dirInfo.ioDrDirID == 2L )
|
|
break;
|
|
|
|
cBlock.dirInfo.ioDrDirID=cBlock.dirInfo.ioDrParID;
|
|
}
|
|
|
|
if ( err )
|
|
{
|
|
SETUP_PLUGIN_ERROR( "\p pathFromFSSpec: possible PBGetCatInfoSync error;g", err );
|
|
if ( h )
|
|
{
|
|
DisposeHandle( h );
|
|
h = NULL;
|
|
}
|
|
}
|
|
return h;
|
|
}
|