home *** CD-ROM | disk | FTP | other *** search
- /*
- * ---------------------------------------------------------------------
- * CGenericAE.c :
- *
- * © Copyright 1992 by F. Menneteau. All rights reserved.
- * This code can be both distributed and used freely.
- *
- * ---------------------------------------------------------------------
- */
-
-
- #include "CGenericAE.h"
-
-
- /*************************************************************************
- * METHOD DEFINITIONS
- *************************************************************************/
- CGenericAE::CGenericAE(void)
- {
- fEventIsValid = FALSE ;
- fReplyIsValid = FALSE ;
- fDescIsValid = FALSE ;
- }
-
-
- CGenericAE::~CGenericAE(void)
- {
- if ( fEventIsValid )
- (void) AEDisposeDesc(&itsEvent) ;
-
- if ( fReplyIsValid )
- (void) AEDisposeDesc(&itsReply) ;
-
- if ( fDescIsValid )
- (void) AEDisposeDesc(&itsAEAddrDesc) ;
- }
-
-
- Size CGenericAE::strcspn(const Ptr s1, const Ptr s2)
- {
- Size LcSizeResult ;
-
- asm {
- movea.l s1,a0 ; A0 = s1
- moveq #-1,d0 ; D0.L = result
- @1 addq.l #1,d0
- move.b (a0)+,d1
- beq.s @3
- movea.l s2,a1 ; A1 = s2
- @2 move.b (a1)+,d2
- beq.s @1
- cmp.b d1,d2
- bne.s @2
- @3 move.l D0,LcSizeResult
- }
- return(LcSizeResult) ;
- }
-
-
- OSErr CGenericAE::privBuidTargetDesc(
- TargetInfPtr TheTargetInfPtr)
- {
- char LcChar ;
- DescType LcDescType ;
- Ptr LcPtr ;
- Size LcSize ;
- ProcessSerialNumber LcPSN ;
-
- switch ( TheTargetInfPtr->tSelector ) {
- case sTARGET_ID :
- LcDescType = typeTargetID ;
- LcPtr = (Ptr) &(TheTargetInfPtr->u.tTargetID) ;
- LcSize = sizeof(TheTargetInfPtr->u.tTargetID) ;
- break ;
-
- case sSIGN_ONLY :
- LcDescType = typeApplSignature ;
- LcPtr = (Ptr) &(TheTargetInfPtr->u.s.tSignature) ;
- LcSize = sizeof(TheTargetInfPtr->u.s.tSignature) ;
- break ;
-
- case sTYPE_AND_SIGN :
- itsError = GetProcessPSN(TheTargetInfPtr->u.s.tType,
- TheTargetInfPtr->u.s.tSignature,&LcPSN) ;
-
- LcDescType = typeProcessSerialNumber ;
- LcPtr = (Ptr) &LcPSN ;
- LcSize = sizeof(LcPSN) ;
- break ;
-
- case sPSN :
- LcDescType = typeProcessSerialNumber ;
- LcPtr = (Ptr) &(TheTargetInfPtr->u.tPSNumber) ;
- LcSize = sizeof(TheTargetInfPtr->u.tPSNumber) ;
- break ;
-
- case sSESSION_ID :
- LcDescType = typeSessionID ;
- LcPtr = (Ptr) &(TheTargetInfPtr->u.tSessionID);
- LcSize = sizeof(TheTargetInfPtr->u.tSessionID) ;
- break ;
-
- default :
- itsError = errAEWrongDataType ;
- }
-
- RETN_IF_ERR(itsError) ;
-
- MyHLock((Handle) this,&LcChar) ;
-
- if ( fDescIsValid ) { // itsAEAddrDesc was previously initialized
- (void) AEDisposeDesc(&itsAEAddrDesc) ;
- fDescIsValid = FALSE ;
- }
-
- if ( (itsError = AECreateDesc(LcDescType,LcPtr,LcSize,
- &itsAEAddrDesc)) == noErr )
- fDescIsValid = TRUE ;
-
- MyHUnlock((Handle) this,LcChar) ;
- return(itsError) ;
- }
-
-
- OSErr CGenericAE::BuildTargetWithTargetID(
- TargetIDPtr TheTargetIDPtr)
- {
- TargetInfo LcTargetInfo ;
-
- LcTargetInfo.tSelector = sTARGET_ID ;
- LcTargetInfo.u.tTargetID = *TheTargetIDPtr ;
-
- return(privBuidTargetDesc(&LcTargetInfo)) ;
- }
-
-
- OSErr CGenericAE::BuildTargetWithSignOnly(
- OSType TheSignature)
- {
- TargetInfo LcTargetInfo ;
-
- LcTargetInfo.tSelector = sSIGN_ONLY ;
- LcTargetInfo.u.s.tType = (OSType) NULL ;
- LcTargetInfo.u.s.tSignature = TheSignature ;
-
- return(privBuidTargetDesc(&LcTargetInfo)) ;
- }
-
-
- OSErr CGenericAE::BuildTargetWithTypeAndSign(
- OSType TheType,
- OSType TheSignature)
- {
- TargetInfo LcTargetInfo ;
-
- LcTargetInfo.tSelector = sTYPE_AND_SIGN ;
- LcTargetInfo.u.s.tType = TheType ;
- LcTargetInfo.u.s.tSignature = TheSignature ;
-
- return(privBuidTargetDesc(&LcTargetInfo)) ;
- }
-
-
- OSErr CGenericAE::BuildTargetWithPSN(
- ProcessSerialNumberPtr ThePSNPtr)
- {
- TargetInfo LcTargetInfo ;
-
- LcTargetInfo.tSelector = sPSN ;
- LcTargetInfo.u.tPSNumber = *ThePSNPtr ;
-
- return(privBuidTargetDesc(&LcTargetInfo)) ;
- }
-
-
- OSErr CGenericAE::BuildTargetWithSessionID(
- PPCSessRefNumPtr TheSeesionID)
- {
- TargetInfo LcTargetInfo ;
-
- LcTargetInfo.tSelector = sSESSION_ID ;
- LcTargetInfo.u.tSessionID = *TheSeesionID ;
-
- return(privBuidTargetDesc(&LcTargetInfo)) ;
- }
-
-
- OSErr CGenericAE::BuildTargetWithRemoteName(
- Ptr TheRemoteName)
- {
- Str31 LcZone ;
- Str31 LcServer ;
- Str32 LcTarget ;
- Size LcSize ;
- rPtr LcPtr ;
- TargetInfo LcTargetInfo ;
-
- /*
- * Extract from TheRemoteName a Zone, a Server and a Target name
- * and call the GetTargetID function.
- *
- * TheRemoteName can have the following forms:
- * [1] "<zone>:<server>:<target>"
- * [2] ":<server>:<target>"
- *
- * If a <zone> is not specified, it means we want to use the
- * local zone (and that case <zone> must be set to "*").
- */
- LcPtr = TheRemoteName ;
- PtoCstr((unsigned char *) LcPtr) ;
-
- if ( LcPtr[0] == *DELIMITER )
- pstrcpy((Ptr) LcZone,(Ptr) "\p*") ;
- else {
- LcSize = strcspn(LcPtr,DELIMITER) ;
- BlockMove(LcPtr,&LcZone[1],LcSize) ;
- *(LcZone) = (char) LcSize ;
- LcPtr += LcSize ;
- }
-
- LcPtr++ ; // skip the DELIMITER character
-
- if ( (LcSize = strcspn(LcPtr,DELIMITER)) == (Size) 0 )
- return(itsError = afpNoServer) ;
-
- BlockMove(LcPtr,&LcServer[1],LcSize) ;
- *(LcServer) = (char) LcSize ;
- LcPtr += (LcSize + 1) ;
-
- CtoPstr(LcPtr) ;
- pstrcpy((Ptr) LcTarget,LcPtr) ;
-
- itsError = GetTargetID(
- LcZone,
- LcServer,
- LcTarget,
- &LcTargetInfo.u.tTargetID) ;
-
- RETN_IF_ERR(itsError) ;
-
- LcTargetInfo.tSelector = sTARGET_ID ;
- return(privBuidTargetDesc(&LcTargetInfo)) ;
- }
-
-
- OSErr CGenericAE::AskAndBuildTarget(
- SelectorType TheSelectorType)
- {
- PortInfoRec LcPortInfoRec ;
- LocationNameRec LcLocNameRec ;
- TargetInfo LcTargetInfo ;
-
- itsError = PPCBrowser(
- NULL, // prompt
- NULL, // applListLabel
- FALSE, // defaultSpecified
- &LcLocNameRec, // theLocation
- &LcPortInfoRec, // thePortInfo
- NULL, // PPCFilterProcPtr
- NULL) ; // theLocNBPType
-
- RETN_IF_ERR(itsError) ;
-
- LcTargetInfo.tSelector = TheSelectorType ;
-
- switch ( TheSelectorType ) {
- case sTARGET_ID :
- LcTargetInfo.u.tTargetID.sessionID = 0L ;
- LcTargetInfo.u.tTargetID.location = LcLocNameRec ;
- LcTargetInfo.u.tTargetID.name = LcPortInfoRec.name;
-
- break ;
-
- case sSIGN_ONLY :
- case sTYPE_AND_SIGN : {
- ProcessInfoRec LcProcInfoRec ;
- ProcessSerialNumber LcPSN ;
-
- if ( (itsError = GetProcessSerialNumberFromPortName(
- &LcPortInfoRec.name,&LcPSN)) != noErr )
- break ;
-
- LcProcInfoRec.processInfoLength = sizeof(LcProcInfoRec) ;
- LcProcInfoRec.processName = (StringPtr) NULL ;
- LcProcInfoRec.processAppSpec = (FSSpecPtr) NULL ;
-
- if ( (itsError = GetProcessInformation(
- &LcPSN,&LcProcInfoRec)) != noErr )
- break ;
-
- LcTargetInfo.u.s.tType = LcProcInfoRec.processType ;
- LcTargetInfo.u.s.tSignature = LcProcInfoRec.processSignature ;
-
- if ( TheSelectorType == sSIGN_ONLY )
- LcTargetInfo.u.s.tType = (OSType) NULL ;
- }
-
- case sPSN :
- itsError = GetProcessSerialNumberFromPortName(
- &LcPortInfoRec.name,&LcTargetInfo.u.tPSNumber) ;
- break ;
-
- case sSESSION_ID : /* I really don't know how to get a SessionID */
- // FALLS THROUGH NEXT CASE
-
- default :
- LcTargetInfo.tSelector = sNONE ;
- itsError = errAEWrongDataType ;
- }
-
- RETN_IF_ERR(itsError) ;
- return(privBuidTargetDesc(&LcTargetInfo)) ;
- }
-
-
- OSErr CGenericAE::CreateAE(
- DescType TheEventClass,
- DescType TheEventID)
- {
- char LcChar ;
-
- if ( !fDescIsValid )
- return(itsError = connectionInvalid) ;
-
- if ( fEventIsValid ) { // itsEvent was previously initialized
- (void) AEDisposeDesc(&itsEvent) ;
- fEventIsValid = FALSE ;
- }
-
- MyHLock((Handle) this,&LcChar) ;
-
- itsError = AECreateAppleEvent(
- TheEventClass,
- TheEventID,
- &itsAEAddrDesc,
- kAutoGenerateReturnID,
- kAnyTransactionID,
- &itsEvent) ;
-
- MyHUnlock((Handle) this,LcChar) ;
- RETN_IF_ERR(itsError) ;
-
- fEventIsValid = TRUE ;
- return(itsError = noErr) ;
- }
-
-
- OSErr CGenericAE::protPutParam(
- AEKeyword theAEKeyword,
- DescType TheTypeCode,
- Ptr TheDataPtr,
- Size TheDataSize)
- {
- char LcChar ;
-
- if ( !fEventIsValid )
- return(itsError = errAENotAEDesc) ;
-
- MyHLock((Handle) this,&LcChar) ;
-
- itsError = AEPutParamPtr(
- &itsEvent,theAEKeyword,TheTypeCode,TheDataPtr,TheDataSize) ;
-
- MyHUnlock((Handle) this,LcChar) ;
- return(itsError) ;
- }
-
-
- OSErr CGenericAE::protFolderPathPutParam(
- Ptr TheFolderPath) // Can be a disk name
- {
- char LcChar ;
- AliasHandle LcFolderAlias ;
-
- if ( !fEventIsValid )
- return(itsError = errAENotAEDesc) ;
-
- itsError = EntityPathToAlias(TheFolderPath,typeFOLDER,&LcFolderAlias);
- RETN_IF_ERR(itsError) ;
-
- MyHLock((Handle) this,&LcChar) ;
- HLock((Handle) LcFolderAlias) ;
-
- itsError = AEPutParamPtr(
- &itsEvent,
- keyDirectObject,
- typeAlias,
- (Ptr) *LcFolderAlias,
- (**LcFolderAlias).aliasSize) ;
-
- HUnlock((Handle) LcFolderAlias) ;
- DisposHandle((Handle) LcFolderAlias) ;
- MyHUnlock((Handle) this,LcChar) ;
-
- return(itsError) ;
- }
-
-
- OSErr CGenericAE::protFilesListPutParam(
- Ptr TheFolderPath, // can be empty
- Ptr TheFileList) // comma delimited list of names.
- {
- Str255 LcFolderPath ;
- Str255 LcFullPathName ;
- Str255 LcFileList ;
- AEDescList LcAEDescList ;
- AliasHandle LcFileAlias ;
- rPtr LcFilePtr ;
- register Size LcSize ;
- rint LcCount ;
- char LcChar ;
-
- if ( !fEventIsValid )
- return(itsError = errAENotAEDesc) ;
-
- itsError = AECreateList((Ptr) NULL,(Size) 0,FALSE,&LcAEDescList) ;
- RETN_IF_ERR(itsError) ;
-
- /*
- * Save folder name because we can modify it.
- */
- if ( TheFolderPath == (Ptr) NULL )
- pstrcpy((Ptr) LcFolderPath,PEMPTY) ;
- else {
- pstrcpy((Ptr) LcFolderPath,TheFolderPath) ;
-
- if ( (PSTRLASTCHAR(TheFolderPath) != PSTRLASTCHAR(PDELIMITER)) )
- pstrcat((Ptr) LcFolderPath,PDELIMITER) ;
- }
-
- if ( TheFileList == (Ptr) NULL )
- pstrcpy((Ptr) LcFileList,PEMPTY) ;
- else
- pstrcpy((Ptr) LcFileList,TheFileList) ;
-
- LcFilePtr = (Ptr) LcFileList ;
- PtoCstr((unsigned char *) LcFilePtr) ;
-
- for ( LcCount = 1 ; ; LcCount++ ) {
- pstrcpy((Ptr) LcFullPathName,(Ptr) LcFolderPath) ;
-
- LcSize = strcspn(LcFilePtr,COMMA) ;
-
- if ( (Size) *(LcFullPathName) + LcSize > 255 )
- return(bdNamErr) ;
-
- BlockMove(
- LcFilePtr,
- (Ptr) &LcFullPathName[*(LcFullPathName)+1],
- LcSize);
-
- *(LcFullPathName) += (char) LcSize ;
-
- itsError = EntityPathToAlias(
- (Ptr) LcFullPathName,typeFILE,&LcFileAlias) ;
- RETN_IF_ERR(itsError) ;
-
- HLock((Handle) LcFileAlias) ;
-
- itsError = AEPutPtr(
- &LcAEDescList,
- LcCount,
- typeAlias,
- (Ptr) *LcFileAlias,
- (**LcFileAlias).aliasSize) ;
-
- HUnlock((Handle) LcFileAlias) ;
- DisposHandle((Handle) LcFileAlias) ;
-
- LcFilePtr = &LcFilePtr[LcSize] ;
-
- if ( *LcFilePtr == (char) NULL )
- break ;
-
- LcFilePtr++ ; // skip the ',' character
- }
-
- MyHLock((Handle) this,&LcChar) ;
-
- itsError = AEPutParamDesc(
- &itsEvent,
- keySelection,
- &LcAEDescList) ;
-
- MyHUnlock((Handle) this,LcChar) ;
-
- for ( ; LcCount > 0 ; LcCount-- ) {
- (void) AEDeleteItem(&LcAEDescList,LcCount) ;
- }
-
- (void) AEDisposeDesc(&LcAEDescList) ;
-
- return(itsError) ;
- }
-
-
- OSErr CGenericAE::SendAE(
- AESendMode TheAESendMode)
- {
- char LcChar ;
-
- if ( !fEventIsValid )
- return(itsError = errAENotAEDesc) ;
-
- if ( fReplyIsValid )
- (void) AEDisposeDesc(&itsReply) ;
-
- MyHLock((Handle) this,&LcChar) ;
-
- itsError = AESend(
- &itsEvent,
- &itsReply,
- TheAESendMode,
- kAENormalPriority,
- kAEDefaultTimeout,
- (IdleProcPtr) NULL,
- (EventFilterProcPtr) NULL) ;
-
- MyHUnlock((Handle) this,LcChar) ;
- RETN_IF_ERR(itsError) ;
-
- fReplyIsValid = TRUE ;
- return(itsError = noErr) ;
- }
-
-
- OSErr CGenericAE::SendAEWithoutReply(void)
- {
- return(SendAE(kAENoReply)) ;
- }
-
-
- OSErr CGenericAE::SendAEWithReply(void)
- {
- return(SendAE(kAEWaitReply)) ;
- }
-
-
- Boolean CGenericAE::GetEvent(
- AppleEventPtr TheAppleEventPtr)
- {
- if ( fEventIsValid ) {
- *TheAppleEventPtr = itsEvent ;
- return(TRUE) ;
- }
-
- return(FALSE) ;
- }
-
-
- Boolean CGenericAE::GetReply(
- AppleEventPtr TheAppleEventPtr)
- {
- if ( fReplyIsValid ) {
- *TheAppleEventPtr = itsReply ;
- return(TRUE) ;
- }
-
- return(FALSE) ;
- }
-
-
-