トップ / ソースコード / ASDoc

SWFを読む

データを読み込む

まずは読み込みたいSWFのデータをByteArray?に読み込みます。URLLoaderや、FileStream?(AIRのみ)を使いましょう。

// URLLoader

private function loadSWF():void
{
	var loader:URLLoader = new URLLoader();
	loader.dataFormat = URLLoaderDataFormat.BINARY;
	loader.addEventListener(Event.COMPLETE, completeHandler);
	loader.load(new URLRequest('hogehoge.swf'));
}

private function completeHandler(e:Event):void
{
	var loader:URLLoader = URLLoader(e.target);
	// このあと loader.data を使ってごにょごにょします
}
// FileStream

var file:FileStream = new FileStream();
var bytes:ByteArray = new ByteArray();

file.open(new File('hogehoge.swf'), FileMode.READ);
file.readBytes(bytes);
file.close();

// このあと bytes を使ってごにょごにょします

SWFとして読む

まずはさっき作ったByteArray?を使ってByteArrayInputStream?を作ります。

// URLLoaderの場合
var input:DataInput = new ByteArrayInputStream(loader.data);
// FileStreamの場合
var input:DataInput = new ByteArrayInputStream(bytes);

ReadingContext?とSWFReaderを作ります。

var context:ReadingContext = new ReadingContext();
var reader:SWFReader = new SWFReader();

SWFReaderのreadSWFメソッドで読ませます。読ませると、SWFが返ってきます。

var swf:SWF = reader.readSWF(input, context);

あとはSWFを煮るなり焼くなりしましょう。

コンテキストを使う

ReadingContext?では、読み込みに関する設定を行うことが出来ます。

バージョンの強制

ignoreFileVersionをtrueに設定してversionを任意の値にすると、SWFファイルに書かれているバージョンを無視してそのバージョンのSWFとして読み込みます。

バイナリデータの使用

メモリ節約のために、バイナリ系のデータの読み込みのon/offを設定することが出来ます。needsほげほげというプロパティをtrueにすると、そのデータも読み込みます。デフォルトはfalseです。

  • needsAction - ActionScript?2データ
  • needsABC - ActionScript?3データ
  • needsBitmap - ビットマップデータ
  • needsSound - サウンドデータ
  • needsVideo - ビデオデータ
  • needsBinary - DefineBinary?で定義されたバイナリデータ

エラーハンドラ

ErrorHandler?の実装クラスをerrorHandlerプロパティに設定すると、エラーが起こったときに何かしらの処理を行えます。また、handleError/handleWarningメソッドでtrueを返すと、無理矢理読み込み処理を続行出来ます。falseを返すと例外がスローされます。デフォルトでは全て例外になります。

その他

のプロパティは内部的に使用している物なので気にしないでください。

巨大なSWFを読む

タグの数が多いSWFを読む場合、一気に全て読み込むことが出来ないので、少しずつ読む必要があります。今のところ、第四引数で一度に読み込むタグ数を制限出来るので、それを利用してEnterFrame?か何かで回してあげましょう。

private function readSWF():void
{
	_input = new ByteArrayInputStream(bytes);
	_context = new ReadingContext();
	_reader = new SWFReader();
	_swf = new SWF();
	_reader.readSWF(_input, _context, _swf, 2000);
	addEventListener(Event.ENTER_FRAME, readHandler);
}

private function readHandler(e:Event):void
{
	var tags:Tags = _swf.tags;
	var l:uint = tags.numTags;

	// 5000個ずつ読み込む
	_reader.readTags(_input, _context, tags, 5000);

	// 前回と読み込んだタグ数が変わっていなければ
	if (tags.numTags == l) {
		// 読み込み完了!!
		removeEventListener(Event.ENTER_FRAME, readHandler);
	}
}

private var _input:ByteArrayInputStream;
private var _context:ReadingContext;
private var _reader:SWFReader;
private var _swf:SWF;