/* DestroyStream gets called after the file has finished loading, */ static NPError NPP_DestroyStream(NPP instance, NPStream *stream, NPError reason) { PluginInstance* This; if(!instance) return NPERR_INVALID_INSTANCE_ERROR; This = (PluginInstance*) instance->pdata; // if(reason==NPRES_DONE) { This->filesize = This->bytesloaded; This->loadstate = STATE_LOADED; // } if(reason!=NPRES_DONE) { set_error(This,"Image load failed or was canceled (%d)",(int)reason); This->needresume=0; if(This->timer_set) { KillTimer(This->fhWnd,1); This->timer_set=0; } return NPERR_NO_ERROR; } #ifdef MNGPLG_TRACE fprintf(tracefile,"NPP_DestroyStream reason=%d needresume=%d\n",reason,This->needresume); #endif if(This->needresume) { This->needresume=0; // handle_read_error(This, mng_read_resume(This->mng) ); handle_read_error(This, mng_display_resume(This->mng) ); // This->needresume=0; } return NPERR_NO_ERROR; }
static int32 NPP_Write(NPP instance, NPStream *stream, int32 offset, int32 len, void *buffer) { PluginInstance* This; #ifdef MNGPLG_TRACE fprintf(tracefile,"NPP_Write offs=%d len=%d\n",offset,len); #endif if(!instance) return -1; This = (PluginInstance*) instance->pdata; if(!This) return -1; if(len<1) return len; if(offset+len > (int)This->bytesalloc) { // oops, overflowed our memory buffer This->bytesalloc += ALLOC_CHUNK_SIZE; if(This->mngdata) { This->mngdata=realloc(This->mngdata, This->bytesalloc); } else { // first time This->mngdata=malloc(This->bytesalloc); } if(!This->mngdata) { warn(This,"Cannot allocate memory for image (%d,%d,%p",offset,len,buffer); return -1; } } // now we should have enough room to copy the data to memory CopyMemory(&This->mngdata[offset],buffer,len); This->bytesloaded = offset+len; // now, check if it's time to call mng_read_resume if(This->needresume && (This->bytesloaded >= (This->libmngpos + This->byteswanted)) ) { This->needresume=0; // handle_read_error(This, mng_read_resume(This->mng) ); #ifdef MNGPLG_TRACE fprintf(tracefile,"NPP_Write display_resume bytesloaded=%d libmngpos=%d byteswanted=%d\n", This->bytesloaded,This->libmngpos,This->byteswanted); #endif handle_read_error(This, mng_display_resume(This->mng) ); } return len; // The number of bytes accepted -- we always accept them all. }
// return 1 if okay static int my_init_mng(PluginInstance *This) { mng_retcode rv; int err; This->mng = mng_initialize((mng_ptr)This,memallocfunc,memfreefunc,NULL); //(mng_memalloc) (mng_memfree) #ifdef MNGPLG_CMS init_color_management(This); #endif err=0; rv=mng_setcb_openstream (This->mng, callback_openstream ); if(rv) err++; rv=mng_setcb_closestream (This->mng, callback_closestream ); if(rv) err++; rv=mng_setcb_readdata (This->mng, callback_readdata ); if(rv) err++; rv=mng_setcb_processheader (This->mng, callback_processheader); if(rv) err++; rv=mng_setcb_getcanvasline (This->mng, callback_getcanvasline); if(rv) err++; rv=mng_setcb_refresh (This->mng, callback_refresh ); if(rv) err++; rv=mng_setcb_gettickcount (This->mng, callback_gettickcount ); if(rv) err++; rv=mng_setcb_settimer (This->mng, callback_settimer ); if(rv) err++; rv=mng_setcb_processtext (This->mng, callback_processtext ); if(rv) err++; #ifdef MNGPLG_TRACE rv=mng_setcb_traceproc (This->mng, callback_traceproc ); if(rv) err++; #endif if(err) { warn(This,"Error setting libmng callback functions"); return 0; } rv= mng_set_suspensionmode (This->mng,MNG_TRUE); if(rv) { warn(This,"Error setting suspension mode"); return 0; } // if the web page author provided a bgcolor, use it if(This->force_bgcolor) { rv=mng_set_bgcolor (This->mng, This->bg_r, This->bg_g, This->bg_b); } #ifdef MNGPLG_TRACE fprintf(tracefile,"initial readdisplay\n"); #endif handle_read_error(This, mng_readdisplay(This->mng) ); return 1; }
/* * Handle an event that was generated in Bareos */ static bRC handlePluginEvent(bpContext *ctx, bsdEvent *event, void *value) { Dmsg1(dbglvl, "scsicrypto-sd: handlePluginEvent event %d\n", event->eventType); switch (event->eventType) { case bsdEventLabelRead: case bsdEventLabelWrite: case bsdEventVolumeUnload: return do_clear_scsi_encryption_key(value); case bsdEventLabelVerified: return do_set_scsi_encryption_key(value); case bsdEventReadError: return handle_read_error(value); case bsdEventDriveStatus: return send_device_encryption_status(value); case bsdEventVolumeStatus: return send_volume_encryption_status(value); default: Dmsg1(dbglvl, "scsicrypto-sd: Unknown event %d\n", event->eventType); break; } return bRC_OK; }
/*+++++++++++++++++++++++++++++++++++++++++++++++++ * PluginWindowProc * Handle the Windows window-event loop. +++++++++++++++++++++++++++++++++++++++++++++++++*/ static LRESULT CALLBACK PluginWindowProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { PluginInstance* This; HDC hdc; RECT rect; This = (PluginInstance*) GetProp(hWnd, gInstanceLookupString); if(!This) return DefWindowProc( hWnd, Msg, wParam, lParam); switch(Msg) { case WM_ERASEBKGND: { HBRUSH br; hdc= (HDC)wParam; if(This->bkgdbrush) br=This->bkgdbrush; else br=GetStockObject(GRAY_BRUSH); GetClientRect(hWnd,&rect); FillRect(hdc,&rect,br); return 1; } case WM_HSCROLL: case WM_VSCROLL: scrollmsg(This,Msg,(int)(LOWORD(wParam)),(short int)(HIWORD(wParam))); return 0; case WM_SIZE: find_window_size(This); set_scrollbars(This); return 0; case WM_CONTEXTMENU: case WM_RBUTTONUP: ContextMenu(This, hWnd); return 0; case WM_SETCURSOR: if(LOWORD(lParam)==HTCLIENT) { if(This->islink) { SetCursor(This->linkcursor); return 1; } } break; case WM_LBUTTONDOWN: SetCapture(This->fhWnd); This->mouse_captured=1; if(This->dynamicmng && This->mng && !This->errorflag) { DynamicMNG_FireEvent(This,4,MAKEPOINTS(lParam)); } return 0; case WM_LBUTTONUP: { RECT rc; POINT pt; if(This->mouse_captured) { ReleaseCapture(); This->mouse_captured=0; } if(This->dynamicmng && This->mng && !This->errorflag) { DynamicMNG_FireEvent(This,5,MAKEPOINTS(lParam)); } // if mouse is not over image, don't follow links, etc. GetWindowRect(This->fhWnd,&rc); GetCursorPos(&pt); if(!PtInRect(&rc,pt)) return 0; if(This->islink) { NPN_GetURL(This->instance,This->linkurl,This->linktarget); return 0; } else if(This->errorflag) { display_last_error(This); } } return 0; case WM_MOUSEMOVE: if(This->dynamicmng && This->mng && This->lpdib && !This->errorflag) { POINTS pos; int overimage; pos=MAKEPOINTS(lParam); overimage=0; if(pos.x>=0 && pos.x<This->lpdibinfo->biWidth && pos.y>=0 && pos.y<This->lpdibinfo->biHeight) { overimage=1; } if(overimage) { if(This->mouse_over_mng) { // mouse is still over image: mouse move event DynamicMNG_FireEvent(This,2,pos); // 2=mouse move } else { // mouse wasn't over the image but now it is: mouse-enter event DynamicMNG_FireEvent(This,1,pos); // mouse enter } } else { // mouse not now over image if(This->mouse_over_mng) { // ... but it used to be pos.x=0; pos.y=0; DynamicMNG_FireEvent(This,3,pos); // 3=mouse leave } } This->mouse_over_mng=overimage; // remember for next time if(This->mouse_over_mng && (This->dynamicmng==1) ) { #define MOUSE_POLL_INTERVAL 100 // milliseconds SetTimer(This->fhWnd,2,MOUSE_POLL_INTERVAL,NULL); This->timer2_set=0; } } return 0; case WM_PAINT: { PAINTSTRUCT paintStruct; HDC hdc; RECT rect2; hdc = BeginPaint( hWnd, &paintStruct ); SetWindowOrgEx(hdc,This->xscrollpos,This->yscrollpos,NULL); GetClientRect(hWnd,&rect); if(This) { if(This->errorflag || !This->lpdib) { SelectObject(hdc,hfontMsg); Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom); rect2.left=rect.left+2; rect2.top=rect.top+2; rect2.right=rect.right-2; rect2.bottom=rect.bottom-2; if(This->errorflag) { DrawText(hdc,"MNG PLUG-IN ERROR!",-1,&rect2,DT_LEFT|DT_WORDBREAK); } else { if(This->loadstate>=STATE_LOADING) { DrawText(hdc,"MNG image loading...",-1,&rect2,DT_LEFT|DT_WORDBREAK); } else { DrawText(hdc,"MNG plug-in",-1,&rect2,DT_LEFT|DT_WORDBREAK); } } } else if(This->lpdib) { StretchDIBits(hdc, 0,0,This->lpdibinfo->biWidth,This->lpdibinfo->biHeight, 0,0,This->lpdibinfo->biWidth,This->lpdibinfo->biHeight, &((BYTE*)(This->lpdib))[sizeof(BITMAPINFOHEADER)], (LPBITMAPINFO)This->lpdib,DIB_RGB_COLORS,SRCCOPY); } } EndPaint( hWnd, &paintStruct ); } return 0; case WM_TIMER: switch(wParam) { case 1: // the main animation timer KillTimer(hWnd,1); This->timer_set=0; #ifdef MNGPLG_TRACE fprintf(tracefile,"WM_TIMER display_resume bytesloaded=%d\n",This->bytesloaded); #endif if(This->mng) { if(!This->needresume) { handle_read_error(This, mng_display_resume(This->mng) ); } } return 0; case 2: // timer for polling mouse position { RECT rc; POINT pt; POINTS pos; GetWindowRect(hWnd,&rc); GetCursorPos(&pt); if(!PtInRect(&rc,pt)) { KillTimer(hWnd,2); pos.x=0; pos.y=0; DynamicMNG_FireEvent(This,3,pos); // 3=mouse leave This->mouse_over_mng=0; } } return 0; } break; } /* Forward unprocessed messages on to their original destination * (the window proc we replaced) */ return This->fDefaultWindowProc(hWnd, Msg, wParam, lParam); }
static void ContextMenu(PluginInstance *This, HWND hwnd) { int cmd; HMENU menu; POINT pt; unsigned char buf[MAX_PATH], buf2[200]; pt.x=0; pt.y=0; GetCursorPos(&pt); // create context menu dynamically menu=CreatePopupMenu(); if(This->errorflag) { AppendMenu(menu,MF_ENABLED,ID_SHOWERROR,"SHOW ERROR MESSAGE"); AppendMenu(menu,MF_SEPARATOR,0,NULL); } AppendMenu(menu,(This->loadstate>=STATE_LOADED?MF_ENABLED:MF_GRAYED),ID_SAVEAS,"Save Image &As..."); AppendMenu(menu,(This->lpdib?MF_ENABLED:MF_GRAYED),ID_COPYIMAGE,"&Copy Image"); AppendMenu(menu,MF_ENABLED,ID_COPYURL,"Cop&y Image Location"); if(This->islink) { AppendMenu(menu,MF_ENABLED,ID_COPYLINKLOC,"Copy Link Location"); } url2filename(buf,This->url); escapeformenu(buf); if(lstrlen(buf)) { wsprintf(buf2,"View Image (%s)",buf); } else { wsprintf(buf2,"View Image"); } AppendMenu(menu,MF_ENABLED,ID_VIEWIMAGE,buf2); AppendMenu(menu,MF_SEPARATOR,0,NULL); // AppendMenu(menu,(This->mng?MF_ENABLED:MF_GRAYED),ID_STOPANIM,"Stop Animation"); AppendMenu(menu,(This->mng?MF_ENABLED:MF_GRAYED)| (This->frozen?MF_CHECKED:MF_UNCHECKED),ID_FREEZE,"&Freeze Animation"); // AppendMenu(menu,(This->mng?MF_ENABLED:MF_GRAYED),ID_RESTARTANIM,"Restart Animation"); AppendMenu(menu,MF_SEPARATOR,0,NULL); AppendMenu(menu,MF_ENABLED,ID_PROPERTIES,"Properties..."); AppendMenu(menu,MF_ENABLED,ID_ABOUT,"About MNG Plug-in..."); cmd=TrackPopupMenuEx(menu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_NONOTIFY|TPM_RETURNCMD| TPM_RIGHTBUTTON,pt.x,pt.y,hwnd,NULL); DestroyMenu(menu); switch(cmd) { case ID_STOPANIM: if(This->mng) { KillTimer(This->fhWnd,1); This->timer_set=0; mng_display_freeze(This->mng); } break; case ID_FREEZE: This->frozen = !This->frozen; if(This->frozen) { KillTimer(This->fhWnd,1); This->timer_set=0; mng_display_freeze(This->mng); } else { handle_read_error(This, mng_display_resume(This->mng) ); } break; case ID_RESTARTANIM: if(!This->frozen) { KillTimer(This->fhWnd,1); This->timer_set=0; mng_display_freeze(This->mng); } This->frozen=1; mng_display_reset(This->mng); This->frozen=0; handle_read_error(This, mng_display_resume(This->mng) ); break; case ID_SAVEAS: SaveImage(This); break; case ID_COPYIMAGE: if(This->lpdib) { CopyToClipboard(This,(unsigned char*)This->lpdib,This->dibsize,CF_DIB); } else { warn(This,"No image to copy"); } break; case ID_COPYURL: CopyToClipboard(This,This->url,lstrlen(This->url)+1,CF_TEXT); break; case ID_COPYLINKLOC: if(This->islink) { CopyToClipboard(This,This->linkurl,lstrlen(This->linkurl)+1,CF_TEXT); } break; case ID_VIEWIMAGE: if(lstrlen(This->url)) NPN_GetURL(This->instance,This->url,"_self"); break; case ID_PROPERTIES: PropDialog(This); break; case ID_ABOUT: AboutDialog(This); break; case ID_SHOWERROR: display_last_error(This); break; } }