From a21d0448e5f62e9d83ac58c9efe60bfa7bd4ba96 Mon Sep 17 00:00:00 2001 From: Honfika Date: Wed, 5 Feb 2014 21:09:17 +0100 Subject: [PATCH] error handling added to flashplayer + cleanup --- trunk/lib/FlashPlayer.exe | Bin 493056 -> 493568 bytes trunk/libsrc/FlashPlayer/uMain.pas | 590 +++++++++++------- trunk/libsrc/Swf2Exe/uMain.pas | 38 +- .../jpexs/decompiler/flash/gui/MainPanel.java | 3 - .../jpexs/decompiler/flash/gui/TagTree.java | 2 - .../gui/generictageditors/StringEditor.java | 2 - .../flash/gui/player/FlashPlayerPanel.java | 218 ++++--- .../flash/gui/timeline/TimelineBodyPanel.java | 4 +- .../gui/timeline/TimelineDepthPanel.java | 2 +- .../flash/gui/timeline/TimelinePanel.java | 7 - .../flash/gui/timeline/TimelineTimePanel.java | 2 +- .../com/jpexs/helpers/SerializableImage.java | 10 +- 12 files changed, 538 insertions(+), 340 deletions(-) diff --git a/trunk/lib/FlashPlayer.exe b/trunk/lib/FlashPlayer.exe index 6d3df290bd1d9eb0c056635aeb5d28b550a640e9..fd24e7944ec0e26289c82cb905534eda1ec9d6bb 100644 GIT binary patch delta 5255 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 TLK*LUb6w12U)#EvM8&@W?C(@s delta 4253 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 bytesToRead) then + begin + Application.Terminate; + end; +end; + +procedure WritePipe(pipe: cardinal; var buffer: TBuf; bytesToWrite: cardinal); +var + written: cardinal; + writeResult: longbool; +begin + written := 0; + writeResult := WriteFile(pipe, buffer, bytesToWrite, written, nil); + if (not writeResult) or (written <> bytesToWrite) then + begin + Application.Terminate; + end; +end; + +procedure TPipeThread.freeSWF(); begin - windows.SetParent(frmMain.Handle,target); if Assigned(flaPreview) then begin + try flaPreview.Stop; flaPreview.Movie := ''; flaPreview.Free; flaPreview := nil; + except + on E: Exception do + begin + end; + end; end; +end; + +procedure TPipeThread.displaySWF(); +begin + Windows.SetParent(frmMain.Handle, target); + freeSWF(); flaPreview := TMySWF.Create(frmMain); - flaPreview.Left:=0; - flaPreview.Top:=0; - flaPreview.Width:=self.w; - flaPreview.Height:=self.h; - frmMain.Caption:='set movie:'+flashFile; + flaPreview.Left := 0; + flaPreview.Top := 0; + flaPreview.Width := self.w; + flaPreview.Height := self.h; + frmMain.Caption := 'set movie:' + flashFile; flaPreview.Parent := frmMain; - flaPreview.Movie:=flashFile; + flaPreview.Movie := flashFile; flaPreview.SetFocus; end; @@ -100,240 +141,345 @@ end; procedure TPipeThread.setPos(); begin -SetWindowPos(frmMain.Handle,0,0,0,self.w,self.h,SWP_SHOWWINDOW); -flaPreview.Left:=0; -flaPreview.Top:=0; -flaPreview.Width:=self.w; -flaPreview.Height:=self.h; -flaPreview.CreateWnd; -//displaySWF(); + SetWindowPos(frmMain.Handle, 0, 0, 0, self.w, self.h, SWP_SHOWWINDOW); + flaPreview.Left := 0; + flaPreview.Top := 0; + flaPreview.Width := self.w; + flaPreview.Height := self.h; + flaPreview.CreateWnd; + //displaySWF(); end; procedure TPipeThread.Execute(); -var pipe:cardinal; -numBytesRead:DWORD; -buffer:TBuf; -pipename:PAnsiChar; -len:integer; -cmd:integer; -written:cardinal; -val:cardinal; -vals:String; -vars:String; +var + f: Textfile; + pipe: cardinal; + buffer: TBuf; + pipename: PAnsiChar; + len: integer; + cmd: integer; + val: cardinal; + vals: string; + vars: string; const - CMD_PLAY = 1; - CMD_RESIZE = 2; - CMD_BGCOLOR = 3; - CMD_CURRENT_FRAME = 4; - CMD_TOTAL_FRAMES = 5; - CMD_PAUSE = 6; - CMD_RESUME = 7; - CMD_PLAYING = 8; - CMD_REWIND = 9; - CMD_GOTO = 10; - CMD_CALL = 11; - CMD_GETVARIABLE = 12; - CMD_SETVARIABLE = 13; + CMD_PLAY = 1; + CMD_RESIZE = 2; + CMD_BGCOLOR = 3; + CMD_CURRENT_FRAME = 4; + CMD_TOTAL_FRAMES = 5; + CMD_PAUSE = 6; + CMD_RESUME = 7; + CMD_PLAYING = 8; + CMD_REWIND = 9; + CMD_GOTO = 10; + CMD_CALL = 11; + CMD_GETVARIABLE = 12; + CMD_SETVARIABLE = 13; begin -pipename:=PAnsiChar('\\.\\pipe\ffdec_flashplayer_'+ParamStr(1)); -while (not self.Terminated) do -begin - pipe:=CreateFile(pipename,GENERIC_READ or GENERIC_WRITE, - FILE_SHARE_READ or FILE_SHARE_WRITE, - nil, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - 0 - ); - numBytesRead:= 0; - - repeat + AssignFile(f, 'c:\log\pipelog.txt'); + if FileExists('c:\log\pipelog.txt') = False then + Rewrite(f) + else begin - ReadFile(pipe,buffer,1,numBytesRead,nil); - cmd:=buffer[0]; - case cmd of - CMD_PLAY: - begin - ReadFile(pipe,buffer,1,numBytesRead,nil); - if(numBytesRead>0) then + Append(f); + end; + + try + pipename := PAnsiChar('\\.\\pipe\ffdec_flashplayer_' + ParamStr(1)); + begin + pipe := CreateFile(pipename, GENERIC_READ or GENERIC_WRITE, + FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + repeat + cmd := 0; + try + ReadPipe(pipe, buffer, 1); + cmd := buffer[0]; + case cmd of + CMD_PLAY: + begin + ReadPipe(pipe, buffer, 1); + len := buffer[0]; + ReadPipe(pipe, buffer, len); + self.flashFile := arrToStr(buffer, len); + try + Synchronize(displaySWF); + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_PLAY error: ' + E.Message); + Flush(f); + end; + end; + end; + CMD_RESIZE: + begin + ReadPipe(pipe, buffer, 4); + self.w := buffer[0] * 256 + buffer[1]; + self.h := buffer[2] * 256 + buffer[3]; + Synchronize(setPos); + end; + CMD_BGCOLOR: + begin + ReadPipe(pipe, buffer, 3); + self.bgColor := RGB(buffer[0], buffer[1], buffer[2]); + Synchronize(setBGColor); + end; + CMD_CURRENT_FRAME: + begin + val := 0; + try + if flaPreview.ReadyState = 4 then + val := flaPreview.CurrentFrame + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_CURRENT_FRAME error: ' + E.Message); + Flush(f); + end; + end; + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + end; + CMD_TOTAL_FRAMES: + begin + val := 0; + try + if flaPreview.ReadyState = 4 then + val := flaPreview.TotalFrames + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_TOTAL_FRAMES error: ' + E.Message); + Flush(f); + end; + end; + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + end; + CMD_PAUSE: + begin + try + flaPreview.Stop; + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_PAUSE error: ' + E.Message); + Flush(f); + end; + end; + end; + CMD_RESUME: + begin + try + flaPreview.Play; + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_RESUME error: ' + E.Message); + Flush(f); + end; + end; + end; + CMD_PLAYING: + begin + buffer[0] := 0; + try + if flaPreview.ReadyState = 4 then + if flaPreview.IsPlaying then + buffer[0] := 1; + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_PLAYING error: ' + E.Message); + Flush(f); + end; + end; + + WritePipe(pipe, buffer, 1); + end; + CMD_REWIND: + begin + try + flaPreview.Rewind; + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_REWIND error: ' + E.Message); + Flush(f); + end; + end; + end; + CMD_GOTO: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + try + flaPreview.GotoFrame(val); + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_GOTO error: ' + E.Message); + Flush(f); + end; + end; + end; + CMD_CALL: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vals, PChar(Addr(buffer)), val); + vals := ''; + try + vals := flaPreview.CallFunction(vals); + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_CALL error: ' + E.Message); + Flush(f); + end; + end; + val := length(vals); + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + Move(vals[1], buffer, val); + WritePipe(pipe, buffer, val); + end; + CMD_GETVARIABLE: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vals, PChar(Addr(buffer)), val); + vals := ''; + try + vals := flaPreview.GetVariable(vals); + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_GETVARIABLE error: ' + E.Message); + Flush(f); + end; + end; + val := length(vals); + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + Move(vals[1], buffer, val); + WritePipe(pipe, buffer, val); + end; + CMD_SETVARIABLE: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vars, PChar(Addr(buffer)), val); + + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vals, PChar(Addr(buffer)), val); + + try + flaPreview.SetVariable(vars, vals); + except + on E: Exception do + begin + freeSWF(); + Writeln(f, 'CMD_SETVARIABLE error: ' + E.Message); + Flush(f); + end; + end; + end; + end; + except + on E: Exception do begin - len:=buffer[0]; - ReadFile(pipe,buffer,len,numBytesRead,nil); - self.flashFile:=arrToStr(buffer,numBytesRead); - Synchronize(displaySWF); + freeSWF(); + Writeln(f, 'FATAL ERROR: ' + E.Message + ' cmd: ' + IntToStr(cmd)); + Flush(f); end; end; - CMD_RESIZE: - begin - ReadFile(pipe,buffer,4,numBytesRead,nil); - self.w:=buffer[0]*256+buffer[1]; - self.h:=buffer[2]*256+buffer[3]; - Synchronize(setPos); - end; - CMD_BGCOLOR: - begin - ReadFile(pipe,buffer,3,numBytesRead,nil); - self.bgColor := RGB(buffer[0],buffer[1],buffer[2]); - Synchronize(setBGColor); - end; - CMD_CURRENT_FRAME: - begin - if flaPreview.ReadyState = 4 then - val:=flaPreview.CurrentFrame - else - val:=0; - buffer[0]:=(val shr 8) mod 256; - buffer[1]:=val mod 256; - WriteFile(pipe,buffer,2,written,nil); - end; - CMD_TOTAL_FRAMES: - begin - if flaPreview.ReadyState = 4 then - val:=flaPreview.TotalFrames - else - val:=0; - buffer[0]:=(val shr 8) mod 256; - buffer[1]:=val mod 256; - WriteFile(pipe,buffer,2,written,nil); - end; - CMD_PAUSE: - begin - flaPreview.Stop; - end; - CMD_RESUME: - begin - flaPreview.Play; - end; - CMD_PLAYING: - begin - buffer[0]:=0; - if flaPreview.ReadyState = 4 then - if flaPreview.IsPlaying then - buffer[0]:=1; - - - WriteFile(pipe,buffer,1,written,nil); - end; - CMD_REWIND: - begin - flaPreview.Rewind; - end; - CMD_GOTO: - begin - ReadFile(pipe,buffer,2,numBytesRead,nil); - val := (buffer[0] shl 8) + buffer[1]; - flaPreview.GotoFrame(val); - end; - CMD_CALL: - begin - ReadFile(pipe,buffer,2,numBytesRead,nil); - val := (buffer[0] shl 8) + buffer[1]; - ReadFile(pipe,buffer,val,numBytesRead,nil); - SetString(vals, PChar(Addr(buffer)), val); - vals:=flaPreview.CallFunction(vals); - val:=length(vals); - buffer[0]:=(val shr 8) mod 256; - buffer[1]:=val mod 256; - WriteFile(pipe,buffer,2,written,nil); - Move(vals[1], buffer, val); - WriteFile(pipe,buffer,val,written,nil); - end; - CMD_GETVARIABLE: - begin - ReadFile(pipe,buffer,2,numBytesRead,nil); - val := (buffer[0] shl 8) + buffer[1]; - ReadFile(pipe,buffer,val,numBytesRead,nil); - SetString(vals, PChar(Addr(buffer)), val); - vals:=flaPreview.GetVariable(vals); - val:=length(vals); - buffer[0]:=(val shr 8) mod 256; - buffer[1]:=val mod 256; - WriteFile(pipe,buffer,2,written,nil); - Move(vals[1], buffer, val); - WriteFile(pipe,buffer,val,written,nil); - end; - CMD_SETVARIABLE: - begin - ReadFile(pipe,buffer,2,numBytesRead,nil); - val := (buffer[0] shl 8) + buffer[1]; - ReadFile(pipe,buffer,val,numBytesRead,nil); - SetString(vars, PChar(Addr(buffer)), val); - - ReadFile(pipe,buffer,2,numBytesRead,nil); - val := (buffer[0] shl 8) + buffer[1]; - ReadFile(pipe,buffer,val,numBytesRead,nil); - SetString(vals, PChar(Addr(buffer)), val); - - flaPreview.SetVariable(vars,vals); - - end; - end; - end - until numBytesRead<=0; - CloseHandle(pipe); - - -end; + until False; + CloseHandle(pipe); + end; + except + on E: Exception do + begin + end; + end; end; procedure TfrmMain.FormActivate(Sender: TObject); begin - - - -if(ParamCount>=2) then + if (ParamCount >= 2) then begin - flaPreview.Parent := frmMain; + flaPreview.Parent := frmMain; - ShowWindow(Application.Handle, SW_HIDE) ; - SetWindowLong(Application.Handle, GWL_EXSTYLE, getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW) ; + ShowWindow(Application.Handle, SW_HIDE); + SetWindowLong(Application.Handle, GWL_EXSTYLE, + getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW); ShowWindow(Application.Handle, SW_SHOW); - SetForegroundWindow(HWND(strtoint(ParamStr(2)))); - frmMain.Caption:='FlashPlayerWindow_'+ParamStr(2); - Application.Title:='FlashPlayerWindow_'+ParamStr(2); - target:=HWND(strtoint(ParamStr(1))); + SetForegroundWindow(HWND(StrToInt(ParamStr(2)))); + frmMain.Caption := 'FlashPlayerWindow_' + ParamStr(2); + Application.Title := 'FlashPlayerWindow_' + ParamStr(2); + target := HWND(StrToInt(ParamStr(1))); SetWindowLong(frmMain.Handle, GWL_STYLE, 0); ShowWindow(frmMain.Handle, SW_SHOW); - frmMain.Left:=0; - frmMain.Top:=0; - windows.SetParent(frmMain.Handle,target); + frmMain.Left := 0; + frmMain.Top := 0; + Windows.SetParent(frmMain.Handle, target); - t:=TPipeThread.Create(true); + t := TPipeThread.Create(True); t.Resume; end; end; procedure TfrmMain.FormCreate(Sender: TObject); begin - if(ParamCount>=2) then - begin - flaPreview := TMySWF.Create(frmMain); - flaPreview.AllowScriptAccess := 'always'; - flaPreview.BackgroundColor:=-1; + if (ParamCount >= 2) then + begin + flaPreview := TMySWF.Create(frmMain); + flaPreview.AllowScriptAccess := 'always'; + flaPreview.BackgroundColor := -1; end; end; procedure TfrmMain.FormDestroy(Sender: TObject); begin -t.Free; + t.Free; end; procedure TfrmMain.tmrWatchDogTimer(Sender: TObject); begin - if target<>0 then - begin + if target <> 0 then + begin if not IsWindow(target) then begin Application.Terminate; end; - end; + end; end; end. diff --git a/trunk/libsrc/Swf2Exe/uMain.pas b/trunk/libsrc/Swf2Exe/uMain.pas index fa5a3537a..178fbec17 100644 --- a/trunk/libsrc/Swf2Exe/uMain.pas +++ b/trunk/libsrc/Swf2Exe/uMain.pas @@ -20,17 +20,18 @@ type type TMySWF = class(TShockwaveFlash) public - Procedure CreateWnd; override; + procedure CreateWnd; override; end; var - frmMain: TfrmMain; + frmMain: TfrmMain; flaPreview: TMySWF; + implementation {$R *.dfm} -Procedure TMySWF.CreateWnd; +procedure TMySWF.CreateWnd; begin inherited; end; @@ -40,13 +41,13 @@ const exeSize = 470016; var stream: TFileStream; - buffer: array of Byte; - tempFile: array[0..MAX_PATH - 1] of Char; - tempPath: array[0..MAX_PATH - 1] of Char; - flashVarData : TVarData; - width: Integer; - height: Integer; - scaleMode: Byte; + buffer: array of byte; + tempFile: array[0..MAX_PATH - 1] of char; + tempPath: array[0..MAX_PATH - 1] of char; + flashVarData: TVarData; + Width: integer; + Height: integer; + scaleMode: byte; begin flaPreview := TMySWF.Create(frmMain); flaPreview.Parent := frmMain; @@ -54,14 +55,13 @@ begin flaPreview.Align := alClient; GetTempPath(MAX_PATH, TempPath); if GetTempFileName(TempPath, PAnsiChar('ffd'), 0, TempFile) = 0 then - raise Exception.Create( - 'GetTempFileName API failed. ' + SysErrorMessage(GetLastError) - ); + raise Exception.Create('GetTempFileName API failed. ' + + SysErrorMessage(GetLastError)); try stream := TFileStream.Create(ParamStr(0), fmOpenRead); stream.Seek(exeSize, soBeginning); - stream.Read(width, 4); - stream.Read(height, 4); + stream.Read(Width, 4); + stream.Read(Height, 4); stream.Read(scaleMode, 1); SetLength(buffer, stream.Size - exeSize); try @@ -70,12 +70,12 @@ begin stream.Free; end; except - width := 12800; - height := 9600; + Width := 12800; + Height := 9600; scaleMode := 3; end; - ClientWidth := width div 20; - ClientHeight := height div 20; + ClientWidth := Width div 20; + ClientHeight := Height div 20; stream := TFileStream.Create(tempFile, fmOpenWrite); try stream.Write(buffer[0], Length(buffer)); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java index ae24faff3..015e5ba2a 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -42,7 +42,6 @@ import com.jpexs.decompiler.flash.gui.player.PlayerControls; import com.jpexs.decompiler.flash.gui.treenodes.SWFBundleNode; import com.jpexs.decompiler.flash.gui.treenodes.SWFNode; import com.jpexs.decompiler.flash.helpers.Freed; -import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; @@ -144,7 +143,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -163,7 +161,6 @@ import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; -import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java b/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java index 6c9c185bd..346c41c98 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java @@ -57,9 +57,7 @@ import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.decompiler.flash.treenodes.TreeNode; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; import java.awt.Font; -import java.awt.FontMetrics; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java index 76aa7e772..b2135ff76 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java @@ -18,8 +18,6 @@ package com.jpexs.decompiler.flash.gui.generictageditors; import java.awt.Color; import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.JTextArea; /** diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java index f8bc82f6c..aba6ada3d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.gui.player; import com.jpexs.decompiler.flash.gui.FlashUnsupportedException; +import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.utf8.Utf8Helper; import com.sun.jna.Native; import com.sun.jna.Platform; @@ -35,8 +36,12 @@ import java.awt.Panel; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -47,8 +52,9 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { private boolean executed = false; private String flash; private HANDLE pipe; - private static final List processes = new ArrayList<>(); - private static final List pipes = new ArrayList<>(); + private HANDLE process; + private WinDef.HWND hwnd; + private WinDef.HWND hwndFrame; private Component frame; private boolean stopped = true; private static final int CMD_PLAY = 1; @@ -64,22 +70,22 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { private static final int CMD_CALL = 11; private static final int CMD_GETVARIABLE = 12; private static final int CMD_SETVARIABLE = 13; + private static final int PIPE_TIMEOUT_MS = 1000; private int frameRate; public boolean specialPlayback = false; private boolean specialPlaying = false; public synchronized String getVariable(String name) { if (pipe != null) { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_GETVARIABLE}, 1, ibr, null); + writeToPipe(new byte[]{CMD_GETVARIABLE}); int nameLen = name.getBytes().length; - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) ((nameLen >> 8) & 0xff), (byte) (nameLen & 0xff)}, 2, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, name.getBytes(), nameLen, ibr, null); + writeToPipe(new byte[]{(byte) ((nameLen >> 8) & 0xff), (byte) (nameLen & 0xff)}); + writeToPipe(name.getBytes()); byte res[] = new byte[2]; - if (Kernel32.INSTANCE.ReadFile(pipe, res, 2, ibr, null)) { + if (readFromPipe(res)) { int retLen = ((res[0] & 0xff) << 8) + (res[1] & 0xff); res = new byte[retLen]; - if (Kernel32.INSTANCE.ReadFile(pipe, res, retLen, ibr, null)) { + if (readFromPipe(res)) { String ret = new String(res, 0, retLen); return ret; } else { @@ -94,31 +100,29 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { public synchronized void setVariable(String name, String value) { if (pipe != null) { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_SETVARIABLE}, 1, ibr, null); + writeToPipe(new byte[]{CMD_SETVARIABLE}); int nameLen = name.getBytes().length; - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) ((nameLen >> 8) & 0xff), (byte) (nameLen & 0xff)}, 2, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, name.getBytes(), nameLen, ibr, null); + writeToPipe(new byte[]{(byte) ((nameLen >> 8) & 0xff), (byte) (nameLen & 0xff)}); + writeToPipe(name.getBytes()); int valLen = value.getBytes().length; - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) ((valLen >> 8) & 0xff), (byte) (valLen & 0xff)}, 2, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, value.getBytes(), valLen, ibr, null); + writeToPipe(new byte[]{(byte) ((valLen >> 8) & 0xff), (byte) (valLen & 0xff)}); + writeToPipe(value.getBytes()); } } public synchronized String call(String callString) { if (pipe != null) { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_CALL}, 1, ibr, null); + writeToPipe(new byte[]{CMD_CALL}); int callLen = callString.getBytes().length; - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) ((callLen >> 8) & 0xff), (byte) (callLen & 0xff)}, 2, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, callString.getBytes(), callLen, ibr, null); + writeToPipe(new byte[]{(byte) ((callLen >> 8) & 0xff), (byte) (callLen & 0xff)}); + writeToPipe(callString.getBytes()); byte res[] = new byte[2]; - if (Kernel32.INSTANCE.ReadFile(pipe, res, 2, ibr, null)) { + if (readFromPipe(res)) { int retLen = ((res[0] & 0xff) << 8) + (res[1] & 0xff); res = new byte[retLen]; - if (Kernel32.INSTANCE.ReadFile(pipe, res, retLen, ibr, null)) { + if (readFromPipe(res)) { String ret = new String(res, 0, retLen); return ret; } else { @@ -133,19 +137,17 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { private synchronized void resize() { if (pipe != null) { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_RESIZE}, 1, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{ + writeToPipe(new byte[]{CMD_RESIZE}); + writeToPipe(new byte[]{ (byte) (getWidth() / 256), (byte) (getWidth() % 256), - (byte) (getHeight() / 256), (byte) (getHeight() % 256),}, 4, ibr, null); + (byte) (getHeight() / 256), (byte) (getHeight() % 256),}); } } private int __getCurrentFrame() { byte[] res = new byte[2]; - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_CURRENT_FRAME}, 1, ibr, null); - if (Kernel32.INSTANCE.ReadFile(pipe, res, res.length, ibr, null)) { + writeToPipe(new byte[]{CMD_CURRENT_FRAME}); + if (readFromPipe(res)) { return ((res[0] & 0xff) << 8) + (res[1] & 0xff); } else { return 0; @@ -175,9 +177,8 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { } } byte[] res = new byte[2]; - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_TOTAL_FRAMES}, 1, ibr, null); - if (Kernel32.INSTANCE.ReadFile(pipe, res, res.length, ibr, null)) { + writeToPipe(new byte[]{CMD_TOTAL_FRAMES}); + if (readFromPipe(res)) { return ((res[0] & 0xff) << 8) + (res[1] & 0xff); } else { return 0; @@ -186,9 +187,8 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { @Override public synchronized void setBackground(Color color) { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_BGCOLOR}, 1, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()}, 3, ibr, null); + writeToPipe(new byte[]{CMD_BGCOLOR}); + writeToPipe(new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()}); } public FlashPlayerPanel(Component frame) { @@ -216,9 +216,28 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { } }); } - private WinDef.HWND hwndFrame; - private void execute() { + private synchronized void execute() { + if (!executed) { + hwnd = new WinDef.HWND(); + hwnd.setPointer(Native.getComponentPointer(this)); + + hwndFrame = new WinDef.HWND(); + hwndFrame.setPointer(Native.getComponentPointer(frame)); + + startFlashPlayer(); + + executed = true; + } + } + + private void restartFlashPlayer() { + Kernel32.INSTANCE.TerminateProcess(process, 0); + Kernel32.INSTANCE.CloseHandle(pipe); + startFlashPlayer(); + } + + private void startFlashPlayer() { String path = Utf8Helper.urlDecode(FlashPlayerPanel.class.getProtectionDomain().getCodeSource().getLocation().getPath()); String appDir = new File(path).getParentFile().getAbsolutePath(); if (!appDir.endsWith("\\")) { @@ -230,13 +249,8 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { return; } - WinDef.HWND hwnd = new WinDef.HWND(); - hwnd.setPointer(Native.getComponentPointer(this)); - - hwndFrame = new WinDef.HWND(); - hwndFrame.setPointer(Native.getComponentPointer(frame)); - - pipe = Kernel32.INSTANCE.CreateNamedPipe("\\\\.\\pipe\\ffdec_flashplayer_" + hwnd.getPointer().hashCode(), Kernel32.PIPE_ACCESS_DUPLEX, Kernel32.PIPE_TYPE_BYTE, 1, 0, 0, 0, null); + String pipeName = "\\\\.\\pipe\\ffdec_flashplayer_" + hwnd.getPointer().hashCode(); + pipe = Kernel32.INSTANCE.CreateNamedPipe(pipeName, Kernel32.PIPE_ACCESS_DUPLEX, Kernel32.PIPE_TYPE_BYTE, 1, 0, 0, 0, null); SHELLEXECUTEINFO sei = new SHELLEXECUTEINFO(); sei.fMask = 0x00000040; @@ -244,13 +258,11 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { sei.lpParameters = new WString(hwnd.getPointer().hashCode() + " " + hwndFrame.getPointer().hashCode()); sei.nShow = WinUser.SW_NORMAL; Shell32.INSTANCE.ShellExecuteEx(sei); - processes.add(sei.hProcess); + process = sei.hProcess; Kernel32.INSTANCE.ConnectNamedPipe(pipe, null); - pipes.add(pipe); - executed = true; } - + public synchronized void stopSWF() { displaySWF("-", null, 1); stopped = true; @@ -264,25 +276,15 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { this.flash = flash; repaint(); this.frameRate = frameRate; - if (!executed) { - execute(); - /* - //How about commenting this out? Will it work? Let's try... - try { - Thread.sleep(1000); - } catch (InterruptedException ex) { - Logger.getLogger(FlashPlayerPanel.class.getName()).log(Level.SEVERE, null, ex); - }*/ - } + execute(); if (bgColor != null) { setBackground(bgColor); } resize(); if (pipe != null) { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_PLAY}, 1, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) flash.getBytes().length}, 1, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, flash.getBytes(), flash.getBytes().length, ibr, null); + writeToPipe(new byte[]{CMD_PLAY}); + writeToPipe(new byte[]{(byte) flash.getBytes().length}); + writeToPipe(flash.getBytes()); } stopped = false; specialPlaying = false; @@ -292,18 +294,25 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { } } + @Override + protected void finalize() throws Throwable { + super.finalize(); + Kernel32.INSTANCE.CloseHandle(pipe); + Kernel32.INSTANCE.TerminateProcess(process, 0); + } + public static void unload() { - if (Platform.isWindows()) { + /*if (Platform.isWindows()) { for (int i = 0; i < processes.size(); i++) { Kernel32.INSTANCE.CloseHandle(pipes.get(i)); Kernel32.INSTANCE.TerminateProcess(processes.get(i), 0); } - } + }*/ } @Override public void paint(Graphics g) { - if ((!executed) && flash != null) { + if (flash != null) { execute(); } super.paint(g); @@ -311,8 +320,7 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { private int specialPosition = 0; private synchronized void __pause() { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_PAUSE}, 1, ibr, null); + writeToPipe(new byte[]{CMD_PAUSE}); } @Override @@ -339,13 +347,11 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { return; } - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_REWIND}, 1, ibr, null); + writeToPipe(new byte[]{CMD_REWIND}); } private synchronized void __play() { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_RESUME}, 1, ibr, null); + writeToPipe(new byte[]{CMD_RESUME}); } @Override @@ -366,10 +372,9 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { if (specialPlayback) { return specialPlaying; } - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_PLAYING}, 1, ibr, null); + writeToPipe(new byte[]{CMD_PLAYING}); byte[] res = new byte[1]; - if (Kernel32.INSTANCE.ReadFile(pipe, res, res.length, ibr, null)) { + if (readFromPipe(res)) { return res[0] == 1; } else { return false; @@ -377,9 +382,8 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { } private synchronized void __gotoFrame(int frame) { - IntByReference ibr = new IntByReference(); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_GOTO}, 1, ibr, null); - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) ((frame >> 8) & 0xff), (byte) (frame & 0xff)}, 2, ibr, null); + writeToPipe(new byte[]{CMD_GOTO}); + writeToPipe(new byte[]{(byte) ((frame >> 8) & 0xff), (byte) (frame & 0xff)}); } @Override @@ -409,4 +413,64 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { public boolean isLoaded() { return !isStopped(); } + + private synchronized boolean writeToPipe(final byte[] data) { + final IntByReference ibr = new IntByReference(); + int result = -1; + try { + result = CancellableWorker.call(new Callable() { + @Override + public Integer call() throws Exception { + boolean result = Kernel32.INSTANCE.WriteFile(pipe, data, data.length, ibr, null); + if (!result) { + return Kernel32.INSTANCE.GetLastError(); + } + if (ibr.getValue() != data.length) { + return -1; + } + return 0; + } + }, PIPE_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException ex) { + // ignore + } + if (result != 0) { + if (result == Kernel32.ERROR_NO_DATA || result == -1) { + restartFlashPlayer(); + } else { + // System.out.println("pipe write failed. datalength: " + data.length + " error:" + result); + } + } + return result == 0; + } + + private synchronized boolean readFromPipe(final byte[] res) { + final IntByReference ibr = new IntByReference(); + int result = -1; + try { + result = CancellableWorker.call(new Callable() { + @Override + public Integer call() throws Exception { + boolean result = Kernel32.INSTANCE.ReadFile(pipe, res, res.length, ibr, null); + if (!result) { + return Kernel32.INSTANCE.GetLastError(); + } + if (ibr.getValue() != res.length) { + return -1; + } + return 0; + } + }, PIPE_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException ex) { + // ignore + } + if (result != 0) { + if (result == Kernel32.ERROR_BROKEN_PIPE || result == -1) { + restartFlashPlayer(); + } else { + // System.out.println("pipe read failed. result: " + result + " datalength: " + res.length + " received: " + ibr.getValue() + " error: " + result); + } + } + return result == 0; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineBodyPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineBodyPanel.java index 39f29092c..219d74083 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineBodyPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineBodyPanel.java @@ -16,8 +16,6 @@ */ package com.jpexs.decompiler.flash.gui.timeline; -import com.jpexs.decompiler.flash.SWF; -import com.jpexs.decompiler.flash.gui.View; import com.jpexs.decompiler.flash.timeline.DepthState; import com.jpexs.decompiler.flash.timeline.Timeline; import java.awt.Color; @@ -56,7 +54,7 @@ public class TimelineBodyPanel extends JPanel implements MouseListener { public static final int borderLinesLength = 2; public static final float fontSize = 10.0f; - private List listeners = new ArrayList<>(); + private final List listeners = new ArrayList<>(); public Point cursor = null; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineDepthPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineDepthPanel.java index 68a158b5f..24e83d988 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineDepthPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineDepthPanel.java @@ -29,7 +29,7 @@ import javax.swing.JPanel; */ public class TimelineDepthPanel extends JPanel { - private int maxDepth; + private final int maxDepth; public static final int padding = 5; public static final float fontSize = 10.0f; private int scrollOffset = 0; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelinePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelinePanel.java index 71a725c4c..64b93bf0c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelinePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelinePanel.java @@ -17,19 +17,12 @@ package com.jpexs.decompiler.flash.gui.timeline; import com.jpexs.decompiler.flash.SWF; -import com.jpexs.decompiler.flash.gui.View; import com.jpexs.decompiler.flash.timeline.Timeline; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Container; import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineTimePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineTimePanel.java index 22110568f..832dfa0cb 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineTimePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineTimePanel.java @@ -39,7 +39,7 @@ public class TimelineTimePanel extends JPanel implements MouseListener { public float fontSize = 10.0f; private int scrollOffset = 0; private int selectedFrame = -1; - private List listeners = new ArrayList<>(); + private final List listeners = new ArrayList<>(); public TimelineTimePanel() { Dimension dim = new Dimension(Integer.MAX_VALUE, TimelinePanel.FRAME_HEIGHT); diff --git a/trunk/src/com/jpexs/helpers/SerializableImage.java b/trunk/src/com/jpexs/helpers/SerializableImage.java index a31ff6ac5..f8da37615 100644 --- a/trunk/src/com/jpexs/helpers/SerializableImage.java +++ b/trunk/src/com/jpexs/helpers/SerializableImage.java @@ -74,9 +74,11 @@ public class SerializableImage implements Serializable { @Override protected Object clone() throws CloneNotSupportedException { - SerializableImage image = new SerializableImage(); - image.image = this.image; - return image; + SerializableImage retImage = new SerializableImage(); + retImage.image = image; + retImage.bounds = new Rectangle2D.Double(bounds.getMinX(), bounds.getMinY(), + bounds.getWidth(), bounds.getHeight()); + return retImage; } public Graphics getGraphics() { @@ -125,10 +127,12 @@ public class SerializableImage implements Serializable { } private void writeObject(ObjectOutputStream out) throws IOException { + out.writeObject(bounds); ImageIO.write(image, "png", out); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + bounds = (Rectangle2D) in.readObject(); image = ImageIO.read(in); } }