/* -*- 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" #include "MUC.h" Boolean openedOurResFileFlag = false; FSSpec pluginFSSpec; TimerUPP initTimerProcUPP = NULL; void* theArray = NULL; // array of data from Reg Server void* lckFileData = NULL; void* animationDat = NULL; void* animationRes = NULL; long lckFileDataLen = 0L; long animationDatLen = 0L; long animationResLen = 0L; short pluginResFile = 0; Boolean freePPPAutoConnectStateDetectedFlag = FALSE; Boolean freePPPAutoConnectState; extern Boolean cursorDirty; extern Boolean connectedFlag; //extern FreePPPPubInterfaceUPP pppPubUPP; //extern PPPRequestUPP pppPluginUPP; extern Str255 gRegAccountName; pascal void initTimer( TMTaskPtr tmTaskPtr ); extern pascal OSErr __initialize( const CFragInitBlock* theInitBlock ); extern pascal void __terminate( void ); pascal OSErr initFragment( const CFragInitBlock* block ) { OSErr err = noErr; err = __initialize( block ); if ( err == noErr ) { if ( block ) { if ( block->fragLocator.where == kDataForkCFragLocator ) { if ( block->fragLocator.u.onDisk.fileSpec ) { pluginFSSpec.vRefNum = block->fragLocator.u.onDisk.fileSpec->vRefNum; pluginFSSpec.parID = block->fragLocator.u.onDisk.fileSpec->parID; BlockMove( block->fragLocator.u.onDisk.fileSpec->name, &pluginFSSpec.name, 1L+(unsigned)(block->fragLocator.u.onDisk.fileSpec->name[ 0 ] ) ); if ( ( pluginResFile = FSpOpenResFile( &pluginFSSpec, fsRdPerm ) ) != kResFileNotOpened ) { openedOurResFileFlag = true; } } } } if ( openedOurResFileFlag == false ) { // default to trying to use the current resfile if for some reason we can't open our resfile pluginResFile = CurResFile(); } } return err; } pascal void terminateFragment( void ) { __terminate(); if ( openedOurResFileFlag == true ) { (void)CloseResFile( pluginResFile ); openedOurResFileFlag = false; } } //------------------------------------------------------------------------------------ // NPP_Initialize: //------------------------------------------------------------------------------------ NPError NPP_Initialize(void) { initAsyncCursors(); // check for FreePPP //if (err=Gestalt(gestaltFreePPPPubInterfaceSelector,(long *)&pppPubUPP)) { // pppPubUPP=NULL; // } //if (pppPubUPP != NULL) { // if (pppPubUPP = NewFreePPPPubInterfaceUPP(pppPubUPP)) { // SETUP_PLUGIN_INFO_STR("\p NPP_Initialize: FreePPP is installed", NULL); // } // else { // pppPubUPP=NULL; // SETUP_PLUGIN_ERROR("\p NPP_Initialize: NewFreePPPPubInterfaceUPP error;g", err); // } // } //else { // SETUP_PLUGIN_ERROR("\p NPP_Initialize: FreePPP is not installed", err); // } // check for FreePPP Config Plugin (how? gestaltFreePPPPluginSelector is registered by FreePPP) //if (err=Gestalt(gestaltFreePPPPluginSelector,(long *)&pppPluginUPP)) { // pppPluginUPP=NULL; // } //if (pppPluginUPP != NULL) { // if (pppPluginUPP = NewPPPRequestUPP(pppPluginUPP)) { // SETUP_PLUGIN_INFO_STR("\p NPP_Initialize: FreePPP Config Plugin is installed", NULL); // } // else { // pppPluginUPP=NULL; // SETUP_PLUGIN_ERROR("\p NPP_Initialize: NewPPPRequestUPP error;g", err); // } // } //else { // SETUP_PLUGIN_ERROR("\p NPP_Initialize: FreePPP Config Plugin is not installed", err); // } // get Java Environment reference // JRIEnv* env = NPN_GetJavaEnv(); // if( env ) { // SetupPlugin::_register( env ); // see NPP_GetJavaClass() // netscape_plugin_Plugin::_use( env ); // only "use" other things, not ourself // register_SetupPlugin(env); // don't "register" ourself (it happens elsewhere) // use_SetupPlugin(env); // register_java_lang_String(env); // register_netscape_javascript_JSObject(env); // use_netscape_javascript_JSObject(env); // use_java_lang_String(env); // } return NPERR_NO_ERROR; } //------------------------------------------------------------------------------------ // NPP_Shutdown: //------------------------------------------------------------------------------------ void NPP_Shutdown(void) { // patchPopUpMenuSelect(FALSE); stopAsyncCursors(); // disposeCache( FALSE ); // as onUnload handlers are broken, detect a quit (or window close) by // noticing when plugin is unloaded. If a Reggie account has ever been created, // and FreePPP is currently connected, then hangup and send Quit AppleEvent // to Navigator if ( gRegAccountName[ 0 ] ) { if ( native_SetupPlugin_SECURE_0005fIsDialerConnected( NULL, NULL ) == TRUE ) { native_SetupPlugin_SECURE_0005fDialerHangup( NULL, NULL ); native_SetupPlugin_SECURE_0005fQuitNavigator( NULL, NULL ); } } // reset FreePPP's "Allow Apps to open connections" option if ( freePPPAutoConnectStateDetectedFlag == TRUE ) CallMUCPlugin( kSetAutoConnectState, &freePPPAutoConnectState ); JRIEnv* env = NPN_GetJavaEnv(); if ( env ) { // SetupPlugin::_unregister( env ); // see NPP_GetJavaClass() // netscape_plugin_Plugin::_unuse( env ); // only "unuse" other things, not ourself // unuse_SetupPlugin(env); // unregister_SetupPlugin(env); // don't "unregister" ourself (it happens elsewhere) // unregister_java_lang_String(env); // unuse_netscape_javascript_JSObject( env); // unregister_netscape_javascript_JSObject(env); unuse_java_lang_String( env ); } } #ifdef SECURITY_DIALOG_ENABLED void blinkButton(DialogPtr theDialog,short itemNum) { Handle itemH; Rect box; short itemType; long theTick; if (theDialog) { GetDItem(theDialog,itemNum,&itemType,&itemH,&box); if (itemH) { HiliteControl((ControlHandle)itemH, kInLabelControlPart); Delay(10L,&theTick); HiliteControl((ControlHandle)itemH, kNoHiliteControlPart); } } } pascal Boolean securityDialogFilter(DialogPtr theDialog, EventRecord *theEvent, short *itemHit) { Boolean retVal=FALSE; GrafPtr savePort; Handle itemH; Rect box; short itemType; if (theDialog) { GetPort(&savePort); SetPort((GrafPtr)theDialog); switch(theEvent->what) { case updateEvt: GetDItem(theDialog,ok,&itemType,&itemH,&box); InsetRect(&box,-4,-4); PenSize(3,3); FrameRoundRect(&box,16,16); PenNormal(); break; case keyDown: switch(theEvent->message & charCodeMask) { case 0x0D: case 0x03: blinkButton(theDialog,ok); *itemHit=ok; retVal=TRUE; break; case 0x1B: blinkButton(theDialog,cancel); *itemHit=cancel; retVal=TRUE; break; case '.': if (theEvent->modifiers & cmdKey) { blinkButton(theDialog,cancel); *itemHit=cancel; retVal=TRUE; } break; } break; } SetPort(savePort); } return(retVal); } #endif SECURITY_DIALOG_ENABLED //------------------------------------------------------------------------------------ // NPP_New: //------------------------------------------------------------------------------------ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved) { CursHandle theCursH=NULL; DialogPtr theDialog=NULL; short itemHit=0; #ifdef SECURITY_DIALOG_ENABLED short saveRefNum; ModalFilterUPP filterUPP; #endif SECURITY_DIALOG_ENABLED if (instance == NULL) { return NPERR_INVALID_INSTANCE_ERROR; } instance->pdata = NPN_MemAlloc(sizeof(PluginInstance)); PluginInstance* This = (PluginInstance*) instance->pdata; if (This != NULL) { if (mode == NP_EMBED) { useCursor(watchCursor); cleanupStartupFolder(); // remove any alias to Account Setup in Startup Items folder // checkSystemSoftware is now done elsewhere /* if (checkSystemSoftware()) { // make sure that FreePPP and MacTCP/OpenTransport are installed return(NPERR_MODULE_LOAD_FAILED_ERROR); } */ // check for expiration - quit if expired // // if (CheckIfExpired()) { // showPluginError(BETAEXPIRED_STRINGID, true); // return(NPERR_MODULE_LOAD_FAILED_ERROR); // } #ifdef SECURITY_DIALOG_ENABLED // B3 security dialog saveRefNum=CurResFile(); if (pluginResFile!=0) UseResFile(pluginResFile); theDialog=GetNewDialog(PLUGIN_SECURITY_DIALOG_RESID,NULL,(WindowPtr)(-1L)); UseResFile(saveRefNum); if (!theDialog) { return(NPERR_MODULE_LOAD_FAILED_ERROR); } if (!(filterUPP=NewModalFilterProc(securityDialogFilter))) { return(NPERR_MODULE_LOAD_FAILED_ERROR); } ShowWindow((WindowPtr)theDialog); InitCursor(); while(TRUE) { ModalDialog(filterUPP,&itemHit); if (itemHit==ok || itemHit==cancel) break; } DisposeDialog(theDialog); DisposeRoutineDescriptor(filterUPP); if (itemHit==cancel) { native_SetupPlugin_QuitNavigator(NULL,NULL); return(NPERR_MODULE_LOAD_FAILED_ERROR); } #endif SECURITY_DIALOG_ENABLED if (theCursH=GetCursor(watchCursor)) { HLock((Handle)theCursH); SetCursor(*theCursH); HUnlock((Handle)theCursH); } /* JRIEnv* env = NPN_GetJavaEnv(); // if NP_EMBED, save JavaScript environment reference jsWindow = netscape_plugin_Plugin_getWindow(env,NPN_GetJavaPeer(instance)); */ } This->fWindow = NULL; This->regData = NULL; This->fMode = mode; This->data = NULL; return(NPERR_NO_ERROR); } else { return(NPERR_OUT_OF_MEMORY_ERROR); } } //------------------------------------------------------------------------------------ // NPP_Destroy: //------------------------------------------------------------------------------------ NPError NPP_Destroy(NPP instance, NPSavedData** save) { if (instance == NULL) return NPERR_INVALID_INSTANCE_ERROR; PluginInstance* This = (PluginInstance*) instance->pdata; if (This != NULL) { if (This->regData) { ::DisposeHandle(This->regData); } NPN_MemFree(instance->pdata); instance->pdata = NULL; if (This->data) { ::DisposeHandle(This->data); } } return NPERR_NO_ERROR; } //------------------------------------------------------------------------------------ // NPP_SetWindow: //------------------------------------------------------------------------------------ NPError NPP_SetWindow(NPP instance, NPWindow* window) { InitCursor(); if (instance == NULL) return NPERR_INVALID_INSTANCE_ERROR; PluginInstance* This = (PluginInstance*) instance->pdata; // // *Developers*: Before setting fWindow to point to the // new window, you may wish to compare the new window // info to the previous window (if any) to note window // size changes, etc. // This->fWindow = window; return NPERR_NO_ERROR; } //------------------------------------------------------------------------------------ // NPP_NewStream: //------------------------------------------------------------------------------------ NPError NPP_NewStream( NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype ) { if ( instance == NULL ) { return NPERR_INVALID_INSTANCE_ERROR; } PluginInstance* This = (PluginInstance*)instance->pdata; regStream* newStream = (regStream*)NPN_MemAlloc( sizeof( regStream ) ); if ( newStream != NULL ) { newStream->data = NULL; newStream->dataLen = 0; stream->pdata = newStream; if ( type ) { newStream->extendedDataFlag = ( !strcmp( type, REG_STREAM_TYPE_V2 ) ) ? TRUE : FALSE; } } else { return NPERR_OUT_OF_MEMORY_ERROR; } return NPERR_NO_ERROR; } // // *Developers*: // These next 2 functions are directly relevant in a plug-in which handles the // data in a streaming manner. If you want zero bytes because no buffer space // is YET available, return 0. As long as the stream has not been written // to the plugin, Navigator will continue trying to send bytes. If the plugin // doesn't want them, just return some large number from NPP_WriteReady(), and // ignore them in NPP_Write(). For a NP_ASFILE stream, they are still called // but can safely be ignored using this strategy. // int32 STREAMBUFSIZE = 0X0FFFFFFF; // If we are reading from a file in NPAsFile // mode so we can take any size stream in our // write call (since we ignore it) //------------------------------------------------------------------------------------ // NPP_WriteReady: //------------------------------------------------------------------------------------ int32 NPP_WriteReady( NPP instance, NPStream* stream ) { if ( instance != NULL ) { PluginInstance* This = (PluginInstance*)instance->pdata; } return STREAMBUFSIZE; // Number of bytes ready to accept in NPP_Write() } //------------------------------------------------------------------------------------ // NPP_Write: //------------------------------------------------------------------------------------ int32 NPP_Write( NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer ) { if ( instance != NULL ) { if ( stream->pdata != NULL ) { regStream* pluginStream = (regStream*)stream->pdata; AppendData( pluginStream, len, buffer ); return len; // The number of bytes accepted } } return -1; // Something went wrong. Stop the stream. } /* countRegItems: count the number of elements of Registration data */ long countRegItems(Handle regData, Boolean extendedDataFlag) { unsigned short len; unsigned long lenLong; long numRegItems=0L,theSize; char *p; theSize=GetHandleSize(regData); p=*regData; while (theSize>0) { if (extendedDataFlag == TRUE) { BlockMove(p,&lenLong,sizeof(lenLong)); p+=sizeof(lenLong); theSize-=sizeof(lenLong); if (theSize0 && theSize>0) { if (extendedDataFlag==TRUE) { BlockMove(p,&len,sizeof(len)); p+=sizeof(len); theSize-=sizeof(len); } else { BlockMove(p,&lenShort,sizeof(lenShort)); p+=sizeof(lenShort); theSize-=sizeof(lenShort); len=(unsigned long)lenShort; } if (theSize0) { if (extendedDataFlag==TRUE) { BlockMove(p,&len,sizeof(len)); p+=sizeof(len); theSize-=sizeof(len); } else { BlockMove(p,&lenShort,sizeof(lenShort)); p+=sizeof(lenShort); theSize-=sizeof(lenShort); len=(unsigned long)lenShort; } if (theSizepdata; if (printInfo->mode == NP_FULL) { // // If weÕre fullscreen, we donÕt want to take over printing, // so return false. NPP_Print will be called again with // mode == NP_EMBED. // printInfo->print.fullPrint.pluginPrinted = false; } else // If not fullscreen, we must be embedded { NPWindow* printWindow = &(printInfo->print.embedPrint.window); if (StartDraw(printWindow)) { DoDraw(This); EndDraw(printWindow); } } } } //------------------------------------------------------------------------------------ // NPP_HandleEvent: // Mac-only. //------------------------------------------------------------------------------------ int16 NPP_HandleEvent(NPP instance, void* event) { Boolean eventHandled = false; OSErr err; static Boolean spinningFlag = false; static unsigned long staticReceivedPacketCount = 0L; unsigned long receivedPacketCount = 0L; static long lastChangeTick = 0L; if ( connectedFlag == TRUE ) { err = CallMUCPlugin( kGetReceivedIPPacketCount, &receivedPacketCount ); if ( !err ) { if ( staticReceivedPacketCount != receivedPacketCount ) { staticReceivedPacketCount = receivedPacketCount; lastChangeTick = TickCount(); if ( spinningFlag == false ) { spinningFlag = true; startAsyncCursors(); } } } if ( TickCount() > ( lastChangeTick + SPIN_TIMEOUT ) ) { if ( spinningFlag == true ) { spinningFlag = false; stopAsyncCursors(); } } } else if ( spinningFlag == true ) { spinningFlag = false; stopAsyncCursors(); } if ( ( spinningFlag == false ) && ( cursorDirty == TRUE ) ) useCursor( 0 ); if ( instance == NULL ) return eventHandled; PluginInstance* This = (PluginInstance*) instance->pdata; if (This != NULL && event != NULL) { EventRecord* ev = (EventRecord*) event; switch (ev->what) { // // Draw ourselves on update events // case updateEvt: // DoDraw(This); eventHandled = true; break; default: break; } } return eventHandled; } //------------------------------------------------------------------------------------ // NPP_URLNotify: Currently just a stub for compatibility with the new API //------------------------------------------------------------------------------------ void NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) { } //------------------------------------------------------------------------------------ // NPP_GetJavaClass: Currently just a stub for compatibility with the new API //------------------------------------------------------------------------------------ jref NPP_GetJavaClass( void ) { JRIEnv* env; jref theRef = NULL; if ( env = NPN_GetJavaEnv() ) { // theRef = SetupPlugin::_register( env ); theRef = register_SetupPlugin( env ); // netscape_plugin_Plugin::_use( env ); use_java_lang_String( env ); // ::_use( env ); // new use_netscape_plugin_Plugin( env ); // ::_use( env ); // new } return theRef; } //------------------------------------------------------------------------------------ // AppendData: //------------------------------------------------------------------------------------ void AppendData( regStream* This, unsigned long len, void* buffer ) { if ( This->data == NULL ) { This->data = ::NewHandle( len ); This->dataLen = 0; } else { SetHandleSize( This->data, GetHandleSize( This->data ) + len ); } BlockMove( buffer, (*This->data) + This->dataLen, len ); This->dataLen += len; } //------------------------------------------------------------------------------------ // StartDraw: //------------------------------------------------------------------------------------ Boolean StartDraw(NPWindow* window) { return true; } //------------------------------------------------------------------------------------ // EndDraw: //------------------------------------------------------------------------------------ void EndDraw(NPWindow* window) { } //------------------------------------------------------------------------------------ // DoDraw: //------------------------------------------------------------------------------------ void DoDraw(PluginInstance* This) { }