AIRデスクトップでQRコード生成を作る

AIRデスクトップアプリケーションでQRコード生成を作ってみた。
処理概要は、、、
flash.net.URLRequestGoogle Chart への要求を指定して
パラメータもTextInput や、DropDownList の結果で画像サイズなど
を入力したURLRequest flash.net.URLLoader で、load 実行することで
生成するQRコード画像を URLLoader から読込む。

ユーザインターフェースの mxml ファイルは、、、

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       xmlns:logic="org.qrmake.*"
                       width="525" height="497" backgroundColor="#C8FFFC"
                       >
   <!--  xmlns:logic="org.qrmake.*" でロジック読込み宣言  -->
   <fx:Declarations>
      <!-- org.qrmake.QuertyQR 生成  -->
      <logic:QuertyQR id="qr"/>
   </fx:Declarations>
   <s:TextInput id="target" x="81" y="22" width="397"/>
   <s:Button id="queryButton" x="302" y="59" label="QRコード作成"/>
   <s:Image id="img" x="26" y="148"/>
   <s:DropDownList id="charType" x="27" y="107" labelField="name" selectedIndex="0">
      <s:dataProvider>
         <s:ArrayCollection>
            <fx:Object name="UTF-8"/>
            <fx:Object name="Shift_JIS"/>
            <fx:Object name="ISO-8859-1"/>
         </s:ArrayCollection>

      </s:dataProvider>
   </s:DropDownList>
   <s:Label x="29" y="22" width="44" height="21" fontSize="14" text="データ" verticalAlign="middle"/>
   <s:Button id="saveButton" x="408" y="57" label="画像保存"/>
   <s:DropDownList id="size" x="27" y="58" labelField="widthxheigt" selectedIndex="5">
      <s:dataProvider>
         <s:ArrayCollection>
            <fx:Object widthxheigt="40x40"/>
            <fx:Object widthxheigt="64x64"/>
            <fx:Object widthxheigt="120x120"/>
            <fx:Object widthxheigt="160x160"/>
            <fx:Object widthxheigt="200x200"/>
            <fx:Object widthxheigt="240x240"/>
            <fx:Object widthxheigt="280x280"/>
            <fx:Object widthxheigt="320x320"/>
         </s:ArrayCollection>

      </s:dataProvider>
   </s:DropDownList>
   <s:DropDownList id="imgtype" x="163" y="58" width="97" labelField="disp" selectedIndex="0">
      <s:dataProvider>
         <s:ArrayCollection>
            <fx:Object name="png" disp="PNG"/>
            <fx:Object name="jpg" disp="JPEG"/>
            <fx:Object name="gif" disp="GIF"/>
            <fx:Object name="bmp" disp="BITMAP"/>
         </s:ArrayCollection>

      </s:dataProvider>
   </s:DropDownList>
   <s:Button id="resetButton" x="163" y="107" width="76" label="リセット"/>
</s:WindowedApplication>

問題のロジック、、、asソース
ボタンクリックハンドラの定義を as ソースで書いてしまった。

package org.qrmake
{
   import flash.display.Loader;
   import flash.events.Event;
   import flash.events.IOErrorEvent;
   import flash.events.MouseEvent;
   import flash.filesystem.File;
   import flash.filesystem.FileMode;
   import flash.filesystem.FileStream;
   import flash.net.URLLoader;
   import flash.net.URLLoaderDataFormat;
   import flash.net.URLRequest;
   import flash.net.URLRequestMethod;
   import flash.net.URLVariables;
   import mx.controls.Alert;
   import mx.core.IMXMLObject;
   import mx.events.FlexEvent;
   import mx.rpc.events.FaultEvent;
   import mx.rpc.events.ResultEvent;

   public class QuertyQR implements IMXMLObject   {
      private var view:QRmake;
      private var loader:URLLoader
      private var file:File;
      public function QuertyQR(){}
      public function initialized(document:Object, id:String):void{
         this.view = document as QRmake;
         tthis.view.addEventListener(FlexEvent.CREATION_COMPLETE,creationCompleteHandler);
      }
      private function creationCompleteHandler(e:FlexEvent):void{
         this.view.queryButton.addEventListener(MouseEvent.CLICK,create);
         this.view.saveButton.addEventListener(MouseEvent.CLICK,saveButtonHandler);
         this.view.resetButton.addEventListener(MouseEvent.CLICK,resetButtonHandler);
      }
      public function create(e:MouseEvent):void{
         if (this.view.target.text != ""){
            var ur:URLRequest = new URLRequest("http://chart.apis.google.com/chart");
            var params:URLVariables = new URLVariables();

            params.cht = "qr"; 
            params.chs = this.view.size.selectedItem.widthxheigt;
            params.chl = this.view.target.text;
            params.choe = this.view.charType.selectedItem.name;
            params.chof = this.view.imgtype.selectedItem.name;
            
            ur.method = URLRequestMethod.GET;
            ur.data = params;
            this.loader = new URLLoader(ur);
            this.loader.dataFormat = URLLoaderDataFormat.BINARY;
            this.loader.addEventListener(Event.COMPLETE,readHandler);
            this.loader.addEventListener(IOErrorEvent.IO_ERROR,faultHandler);
            this.loader.load(ur);

         }
      }
      private function readHandler(e:Event):void{
         var whs:String = this.view.size.selectedItem.widthxheigt;
         var ary:Array = whs.split("x");
         this.view.img.width = ary[0];
         this.view.img.height = ary[1];
         this.view.img.source = this.loader.data;
      }
      private function faultHandler(e:IOErrorEvent):void{
         Alert.show(e.text);
      }
      // for file Save
      private function saveButtonHandler(e:MouseEvent):void{
         if (this.loader != null){
            this.file = new File();
            file.browseForSave("画像の保存先を指定してください");
            file.addEventListener(Event.SELECT,selectFile);
         }else{
            Alert.show("QRコードが作成されてません");
         }
      }
      private function selectFile(e:Event):void{
         var fs:FileStream = new FileStream();
         fs.open(this.file,FileMode.WRITE);
         var fl:Loader = new Loader();
         fs.writeBytes(this.loader.data);
         fs.close();
      }
      // for All clear
      private function resetButtonHandler(e:MouseEvent):void{
         this.view.target.text = "";
         this.view.img.source = null;
         this.loader = null;
      }
   }
}