Can ActionScript tell when a SWF was published?

前端 未结 5 531
面向向阳花
面向向阳花 2020-12-13 22:19

I\'d like to write a little class that adds a Day/Month box showing the date a SWF was published from Flash.

The company I work for regularly produces many, many SWF

相关标签:
5条回答
  • 2020-12-13 22:43

    In case you're using FlashDevelop (which is very nice lightweight, free AS3 IDE) you can do this:

    public static function GetBuildDate() : String
    {
        return CONFIG::timeStamp;
    }
    

    It returns date in format YYYY-MM-DD

    More info: http://www.flashdevelop.org/wikidocs/index.php?title=AS3_Conditional_Compilation

    0 讨论(0)
  • 2020-12-13 22:49

    Not sure if this would work, but could you use an 'include' statement which calls in an externally generated .as file at compile time which has the (then) current date hard-coded into it? You'd need to have a script of some kind running on your server to update this file once a day to keep it current.

    0 讨论(0)
  • 2020-12-13 22:53

    I'm afraid you can't do it in Actionscript. Depending on how you build the swfs, there might be a couple of options. For instance, if you use the Flash IDE, you could use a JSFL script to publish the swf. This jsfl could replace a placeholder variable where you will store the publication date, and the publish the swf (haven't write a JSFL script in a long time but it shouldn't be too hard to get this working).

    So, let's say you have a Version class:

    public class Version {
    
        public var publicationDate:Date = new Date();
    
    }
    

    Your script should read the file where this class lives, find that line and replace it with the current date:

    Something like this:

    var curDate = new Date();
    var dateLine = "public var publication:Date = new Date(" + curDate.getFullYear() + "," + curDate.getMonth() + "," + curDate.getDate() +");";
    
    0 讨论(0)
  • 2020-12-13 22:55

    George is correct. Adobe sneaks an undocumented ProductInfo tag that contains the compilation date in to every compiled swf. The DisplayObject.loaderInfo.bytes contains the the complete uncompressed swf that loaded the Display Object.

    http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/DisplayObject.html#loaderInfo

    So the quickest way to get the swf's compilation date without external libraries (from a Display Object):

    import flash.utils.Endian;
    import flash.display.LoaderInfo;
    import flash.utils.ByteArray;
    ...
    
    private function getCompilationDate():Date{
      if(!stage) throw new Error("No stage");
    
      var swf:ByteArray = stage.loaderInfo.bytes;
      swf.endian = Endian.LITTLE_ENDIAN;
      // Signature + Version + FileLength + FrameSize + FrameRate + FrameCount
      swf.position = 3 + 1 + 4 + (Math.ceil(((swf[8] >> 3) * 4 - 3) / 8) + 1) + 2 + 2;
      while(swf.position != swf.length){
        var tagHeader:uint = swf.readUnsignedShort();
        if(tagHeader >> 6 == 41){
          // ProductID + Edition + MajorVersion + MinorVersion + BuildLow + BuildHigh
          swf.position += 4 + 4 + 1 + 1 + 4 + 4;
          var milli:Number = swf.readUnsignedInt();
          var date:Date = new Date();
          date.setTime(milli + swf.readUnsignedInt() * 4294967296);
          return date; // Sun Oct 31 02:56:28 GMT+0100 2010
        }else
          swf.position += (tagHeader & 63) != 63 ? (tagHeader & 63) : swf.readUnsignedInt() + 4;
      }
      throw new Error("No ProductInfo tag exists");
    }
    

    The SWF Specification: http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

    0 讨论(0)
  • 2020-12-13 23:04

    Also you can read the date from the SWF bytecode with the awesome as3swf library. Check this out.

    0 讨论(0)
提交回复
热议问题