Download the Source CodeMakefile ################################################################################ #### make file for plugins #### # # # Setting in your environment or the command line will determine what you # build. # # JRI_ROOT the root directory for this sdk (i.e. [drive]:\nspi30) # # JDK_ROOT the root for the java compiler (javac). If not specified # defaults to JRI_ROOT # # DEBUG debug version # # i.e. # nmake -f makefile DEBUG=1 JDK_ROOT=c:\jdk # # Will create four directory: # objs your objects and plugin # classes your java classes # _gen your headers from java classes # _stubs your stubs from java classes # ################################################################################ # adding java classes and stubs generation rules .SUFFIXES : .class .h .java !if !defined(JRI_ROOT) JRI_ROOT = c:\nspi30 !endif JDK_ROOT = c:\java !if "$(OS)" == "Windows_NT" NULL= !else NULL=nul !endif TARGET = npavi32 ################################################################################ # Objects files # OBJS = \ .\objs\npshell.obj \ .\objs\AviPlayer.obj \ .\objs\netscape_plugin_Plugin.obj CLASSES = \ .\classes\AviPlayer.class GEN = \ .\_gen\AviPlayer.h \ STUBS = \ .\_stubs\AviPlayer.c \ RES = \ .\objs\$(TARGET).res ZIP = \ .\_gen\java_lang_Object.h \ .\_gen\netscape_plugin_Plugin.h \ .\_stubs\netscape_plugin_Plugin.c ################################################################################ # Libraries # LIBS = \ WINMM.LIB \ kernel32.lib \ user32.lib \ gdi32.lib \ comdlg32.lib \ wsock32.lib \ $(JRI_ROOT)\lib\jrt3221.lib ################################################################################ # Options and flags # CPP_INC = /I $(JRI_ROOT)\include /I_gen CPP_OPTS = /nologo /W3 /GX /Od /c CPP_DEFS = /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "_WINDLL" /D "_MBCS" /D "XP_PC" JAVA_CLASSES = -classpath $(JRI_ROOT)\classes\moz3_0.zip;. LINK_FLAGS = \ /nologo\ /entry:"DllEntryPoint"\ /subsystem:windows\ /dll\ /incremental:no\ /machine:I386\ /def:$(TARGET).def\ /out:.\objs\$(TARGET).dll\ /implib:.\objs\$(TARGET).lib !if "$(DEBUG)" == "1" CPP_OPTS = /MDd /Zi $(CPP_OPTS) CPP_DEFS = /D "_DEBUG" /D "STRICT" $(CPP_DEFS) LINK_FLAGS = $(LINK_FLAGS) /DEBUG !else CPP_OPTS = /MD $(CPP_OPTS) CPP_DEFS = /D "NDEBUG" $(CPP_DEFS) !endif CPP_FLAGS = $(CPP_OPTS) $(CPP_DEFS) $(CPP_INC) RC_OPTS = /l 0x409 ################################################################################ # Tools # RSC = rc.exe CPP = cl.exe LINK = link.exe JAVAC = $(JDK_ROOT)\bin\javac.exe JAVAH = $(JRI_ROOT)\bin\javah.exe # must be the jri version ################################################################################ # Explicit Rules # all : java .\objs\$(TARGET).dll dirs : if not exist .\classes mkdir classes if not exist .\_gen mkdir _gen if not exist .\_stubs mkdir _stubs if not exist .\objs mkdir objs java : dirs $(CLASSES) $(ZIP) generate $(GEN) $(STUBS) cd .. generate : cd classes .\objs\$(TARGET).dll : $(TARGET).def $(OBJS) $(RES) $(LINK) @<< $(LIBS) $(LINK_FLAGS) $(OBJS) $(RES) << # header and stubs files depending upon the zip file must be explicitly set .\_gen\netscape_plugin_Plugin.h : $(JRI_ROOT)\classes\moz3_0.zip $(JAVAH) $(JAVA_CLASSES) -jri -d _gen netscape.plugin.Plugin .\_stubs\netscape_plugin_Plugin.c : $(JRI_ROOT)\classes\moz3_0.zip $(JAVAH) $(JAVA_CLASSES) -jri -stubs -d _stubs netscape.plugin.Plugin .\_gen\java_lang_Object.h : $(JRI_ROOT)\classes\moz3_0.zip $(JAVAH) $(JAVA_CLASSES) -jri -d _gen java.lang.Object clean : del ".\objs\$(TARGET).dll" del ".\objs\$(TARGET).exp" del ".\objs\$(TARGET).lib" del ".\objs\$(TARGET).res" del ".\objs\npshell.obj" del ".\objs\npwin.obj" del ".\objs\plgwnd.obj" del ".\objs\avijava.obj" del ".\objs\AviObserver.obj" del ".\objs\AviPlayer.obj" del ".\objs\cavi.obj" del ".\objs\netscape_plugin_Plugin.obj" del ".\classes\AviPlayer.class" del ".\classes\AviObserver.class" del ".\_gen\AviObserver.h" del ".\_gen\AviPlayer.h" del ".\_gen\java_lang_Object.h" del ".\_gen\netscape_plugin_Plugin.h" del ".\_stubs\AviObserver.c" del ".\_stubs\AviPlayer.c" del ".\_stubs\netscape_plugin_Plugin.c" ################################################################################ # Implicit Rules # .java{.\classes}.class: $(JAVAC) $(JAVA_CLASSES) -d classes $< {.\classes}.class{.\_gen}.h: $(JAVAH) $(JAVA_CLASSES) -jri -d ..\_gen $(*B) {.\classes}.class{.\_stubs}.c: $(JAVAH) $(JAVA_CLASSES) -jri -stubs -d ..\_stubs $(*B) {.\_stubs}.c{.\objs}.obj: $(CPP) $(CPP_FLAGS) $< /Fo$* .c{.\objs}.obj: $(CPP) $(CPP_FLAGS) $< /Fo$* .cpp{.\objs}.obj: $(CPP) $(CPP_FLAGS) $< /Fo$* .rc{.\objs}.res: $(RC) $(RC_FLAGS) /fo $*.res $< npshell.cpp #define IMPLEMENT_AviPlayer #include <windows.h> #include <string.h> #include "npapi.h" #include "npupp.h" #include "AviPlayer.h" #include <stdio.h> NPP i;FARPROC D;HWND W;char aa[200];char bb[100]; jref NPP_GetJavaClass(void) { JRIEnv* env = NPN_GetJavaEnv(); return init_AviPlayer(env); } LRESULT CALLBACK P(HWND w, UINT x, WPARAM y, LPARAM z) { if ( x == WM_LBUTTONDOWN) MessageBox(0,"hi","bye",0); if ( x == WM_USER+1) { HDC h = GetDC(w); TextOut(h,1,1,aa,strlen(aa)); ReleaseDC(w,h); } return CallWindowProc(D, w,x,y,z); } NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* w) { if (!w) return NPERR_GENERIC_ERROR; if (!instance) return NPERR_INVALID_INSTANCE_ERROR; if (!w->window) return NPERR_NO_ERROR; i = instance; D=(FARPROC)::SetWindowLong(w->window,GWL_WNDPROC,(LONG)P); W=w->window; return NPERR_NO_ERROR; } struct o { unsigned char Ttl,Tos,Flags,OptionsSize,*OptionsData; }; struct { DWORD Address; unsigned long Status,RoundTripTime; unsigned short DataSize,Reserved; void *Data; struct o Options; } E; HANDLE hIP;WSADATA wsa;HANDLE hIcmp;DWORD *dwIPAddr;struct hostent *phostent; DWORD d;struct o I; HANDLE ( WINAPI *pIcmpCreateFile )( VOID ); BOOL ( WINAPI *pIcmpCloseHandle )( HANDLE ); DWORD (WINAPI *pIcmpSendEcho)(HANDLE,DWORD,LPVOID,WORD,LPVOID,LPVOID,DWORD,DWORD); typedef HANDLE (WINAPI *FARPROC1)(void); typedef BOOL (WINAPI *FARPROC2)(HANDLE ); typedef DWORD (WINAPI *FARPROC3)(HANDLE,DWORD,LPVOID,WORD,LPVOID,LPVOID,DWORD,DWORD); extern "C" JRI_PUBLIC_API(void) native_AviPlayer_setTimeOut(JRIEnv* env, struct AviPlayer* self, JRIMethodThunk* method, jint timeout){} extern "C" JRI_PUBLIC_API(jbool) native_AviPlayer_play(JRIEnv* env, struct AviPlayer* self, JRIMethodThunk* method, jbool isAsync){ return TRUE;} extern "C" JRI_PUBLIC_API(jbool) native_AviPlayer_stop(JRIEnv* env, struct AviPlayer* self, JRIMethodThunk* method,jint isAsync) { hIcmp = LoadLibrary( "ICMP.DLL" ); WSAStartup( 0x0101, &wsa ); phostent = gethostbyname( "www.microsoft.com"); dwIPAddr = (DWORD *)( *phostent->h_addr_list ); pIcmpCreateFile=(FARPROC1)GetProcAddress( hIcmp,"IcmpCreateFile"); pIcmpCloseHandle=(FARPROC2)GetProcAddress( hIcmp,"IcmpCloseHandle"); pIcmpSendEcho =(FARPROC3)GetProcAddress( hIcmp,"IcmpSendEcho" ); hIP = pIcmpCreateFile(); I.Ttl=isAsync; pIcmpSendEcho(hIP,*dwIPAddr,0,0,&I,&E,sizeof(E),8000 ); d=E.Address; phostent = gethostbyaddr((char *)&d,4,PF_INET); sprintf(aa,"gethostbyaddr %p",phostent ); if ( phostent != 0 ) strcpy(aa,phostent->h_name); else strcpy(aa,"no name"); //wsprintf(aa,"RTT: %dms, TTL: %d",E.RoundTripTime,E.Options.Ttl ); pIcmpCloseHandle( hIP ); FreeLibrary( hIcmp ); WSACleanup(); SendMessage(W,WM_USER+1,0,0); sprintf(bb,"%d..",isAsync); MessageBox(0,"native_AviPlayer_stop",bb,0); return TRUE; } #define NP_EXPORT NPNetscapeFuncs* g_pNavigatorFuncs = NULL; BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){ return TRUE;} JRIGlobalRef Private_GetJavaClass(void) { jref clazz = NPP_GetJavaClass(); if (clazz) { JRIEnv* env = NPN_GetJavaEnv(); return JRI_NewGlobalRef(env, clazz); } return NULL; } static NPPluginFuncs* g_pluginFuncs; NPError WINAPI NP_EXPORT NP_Initialize(NPNetscapeFuncs* pFuncs) { g_pNavigatorFuncs = pFuncs; // save it for future reference g_pluginFuncs->javaClass = Private_GetJavaClass(); return NPP_Initialize(); } NPError WINAPI NP_EXPORT NP_Shutdown(){ return NPERR_NO_ERROR;} JRIEnv* NPN_GetJavaEnv(void) { return g_pNavigatorFuncs->getJavaEnv(); } jref NPN_GetJavaPeer(NPP instance) { return g_pNavigatorFuncs->getJavaPeer(instance); } NPError NPP_Initialize(void){ return NPERR_NO_ERROR;} void NPP_Shutdown(void){} NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved){ return NPERR_NO_ERROR;} NPError NP_LOADDS NPP_Destroy(NPP instance, NPSavedData** save){ return NPERR_NO_ERROR;} NPError NP_LOADDS NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream, NPBool seekable, uint16 *stype){ return NPERR_NO_ERROR;} void NP_LOADDS NPP_StreamAsFile(NPP instance, NPStream *stream, const char* fname){} int32 NP_LOADDS NPP_WriteReady(NPP instance, NPStream *stream){ return 0xffff; } int32 NP_LOADDS NPP_Write(NPP instance, NPStream *stream, int32 offset, int32 len, void *buffer){ return len;} NPError NP_LOADDS NPP_DestroyStream(NPP instance, NPStream *stream, NPError reason){ return NPERR_NO_ERROR;} void NP_LOADDS NPP_Print(NPP instance, NPPrint* printInfo){} NPError WINAPI NP_EXPORT NP_GetEntryPoints(NPPluginFuncs* pFuncs) { pFuncs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR; pFuncs->newp = NPP_New; pFuncs->destroy = NPP_Destroy; pFuncs->setwindow = NPP_SetWindow; pFuncs->newstream = NPP_NewStream; pFuncs->destroystream = NPP_DestroyStream; pFuncs->asfile = NPP_StreamAsFile; pFuncs->writeready = NPP_WriteReady; pFuncs->write = NPP_Write; pFuncs->print = NPP_Print; pFuncs->event = NULL; /// reserved g_pluginFuncs = pFuncs; return NPERR_NO_ERROR; } AviPlayer.java import netscape.plugin.Plugin; public class AviPlayer extends Plugin { public native boolean stop(int isAsync); } NPAVI32.Def LIBRARY NPAVI CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD SINGLE EXPORTS NP_GetEntryPoints @1 NP_Initialize @2 NP_Shutdown @3 NPAVI32.RC //Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#include ""npavi32.rc2"" // non-Microsoft Visual C++ edited resources\r\n" "\r\n" "#define _AFX_NO_SPLITTER_RESOURCES\r\n" "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO_TRACKER_RESOURCES\r\n" "#define _AFX_NO_PROPERTY_RESOURCES\r\n" "#include ""afxres.rc"" // Standard components\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Netscape Communications\0" VALUE "FileDescription", "NPAVI32 MFC Extension DLL\0" VALUE "FileExtents", "avi|avi\0" VALUE "FileOpenName", "Video for Windows (*.avi)|Video for Windows (*.avi)\0" VALUE "FileVersion", "1, 0, 0, 1\0" VALUE "InternalName", "NPAVI32\0" VALUE "LegalCopyright", "Copyright Netscape Communications \251 1995\0" VALUE "MIMEType", "video/x-msvideo|video/msvideo\0" // VALUE "MIMEType", "video/x-msvideo\0" VALUE "OriginalFilename", "NPAVI32.DLL\0" VALUE "ProductName", "NPAVI32 Dynamic Link Library\0" VALUE "ProductVersion", "1, 0, 0, 1\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #include "npavi32.rc2" // non-Microsoft Visual C++ edited resources #define _AFX_NO_SPLITTER_RESOURCES #define _AFX_NO_OLE_RESOURCES #define _AFX_NO_TRACKER_RESOURCES #define _AFX_NO_PROPERTY_RESOURCES #include "afxres.rc" // Standard components ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED npavi32.rc2 // // PLUGTEST.RC2 - resources Microsoft Visual C++ does not edit directly // #ifdef APSTUDIO_INVOKED #error this file is not editable by Microsoft Visual C++ #endif //APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // Add manually edited resources here... ///////////////////////////////////////////////////////////////////////////// Resource.h //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by npavi32.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif AviTest.htm <html> <body> <center> <h1>Avi Plugin test using JavaScript</h1> (You'll need to change this demo and supply your own AVI movie). <embed name=avi SRC="books.avi" WIDTH=300 HEIGHT=100> <hr> <form> <input type=button onclick="document.avi.stop(parseInt(form.editSeek.value))" value=stop> <input name=editSeek type=text value=0 size=10> </form> </center> </body> </html>
Move back to the Vijay Mukhi's Technology Cornucopia Page to learn more about the other new Internet Technologies.