package{
import mx.core.Application;
import mx.containers.ApplicationControlBar;
import mx.containers.HBox;
import mx.containers.VBox;
import mx.containers.BoxDirection;
import mx.controls.Label;
import mx.controls.ToggleButtonBar;
import mx.controls.TextArea;
import mx.events.FlexEvent;
import mx.events.ItemClickEvent;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.FileReference;
import flash.net.Socket;
//
import my.Log;
import my.FlexDefaultComponents;
//========================================================================//
public class Main extends Application{
private var m_log_tarea:TextArea;
//
private var m_freference:FileReference;
private var m_ctrl_socket:Socket;
private var m_data_socket:Socket;
//本来、IDやパスワードを埋め込む事は無いです
private var m_host:String = "************";
private var m_user:String = "********";
private var m_pass:String = "************";
//--------------------------------------------------------------------//
public function Main() {
super();
FlexDefaultComponents.stylesInit();
Log.trace("i Main");
//
this.layout = "absolute";
this.setStyle("backgroundColor", 0xEFF1F1);
this.addEventListener(FlexEvent.APPLICATION_COMPLETE, app_complete);
}
//--------------------------------------------------------------------//
private function app_complete(a_event:FlexEvent):void{
Log.trace("i app_complete:" + a_event);
//
var acbar:ApplicationControlBar = new ApplicationControlBar();
acbar.dock = true;
var label:Label = new Label();
label.text = "FlexでFTPサーバと直接やりとりしてみる";
acbar.addChild(label);
this.addChild(acbar);
//
var root_layout:HBox = new HBox();
root_layout.setStyle("paddingLeft", 8);
root_layout.setStyle("paddingTop", 8);
root_layout.setStyle("paddingRight", 8);
root_layout.setStyle("paddingBottom", 8);
root_layout.y = 8;
root_layout.percentWidth = root_layout.percentHeight = 100;
this.addChild(root_layout);
//
var left_layout:VBox = new VBox();
left_layout.setStyle("paddingLeft", 8);
left_layout.setStyle("paddingTop", 8);
left_layout.setStyle("paddingRight", 8);
left_layout.setStyle("paddingBottom", 8);
root_layout.addChild(left_layout);
//
m_log_tarea = new TextArea();
m_log_tarea.setStyle("fontFamily", "_typewriter");
m_log_tarea.setStyle("fontSize", 11);
m_log_tarea.editable = false;
m_log_tarea.percentWidth = m_log_tarea.percentHeight = 100;
m_log_tarea.text = '';
root_layout.addChild(m_log_tarea);
//
var list_item:Array = [{
label:"FTP接続", type:"login"
}
, {
label:"ファイル選択", type:"browse"
}
, {
label:"アップロード", type:"upload"
}
, {
label:"FTP切断", type:"logout"
}
, {
label:"ログ消去", type:"eraselog"
}
];
var tbbar:ToggleButtonBar = new ToggleButtonBar();
tbbar.direction = BoxDirection.VERTICAL;
tbbar.buttonMode = true;
tbbar.dataProvider = list_item;
tbbar.addEventListener(FlexEvent.CREATION_COMPLETE, tbbar_complete);
tbbar.addEventListener(ItemClickEvent.ITEM_CLICK, tbbar_item_click);
left_layout.addChild(tbbar);
//
m_freference = new FileReference();
m_freference.addEventListener(Event.COMPLETE, freference_complete);
//制御用ソケット
m_ctrl_socket = new Socket();
m_ctrl_socket.addEventListener(Event.CONNECT, ctrl_socket_connect);
m_ctrl_socket.addEventListener(Event.CLOSE, ctrl_socket_close);
m_ctrl_socket.addEventListener(ProgressEvent.SOCKET_DATA, ctrl_socket_data);
m_ctrl_socket.addEventListener(IOErrorEvent.IO_ERROR, socket_io_error);
m_ctrl_socket.addEventListener(
SecurityErrorEvent.SECURITY_ERROR, socket_security_error);
//データ用ソケット
m_data_socket = new Socket();
m_data_socket.addEventListener(Event.CONNECT, data_socket_connect);
m_data_socket.addEventListener(Event.CLOSE, data_socket_close);
m_data_socket.addEventListener(ProgressEvent.SOCKET_DATA, data_socket_data);
m_data_socket.addEventListener(IOErrorEvent.IO_ERROR, socket_io_error);
m_data_socket.addEventListener(
SecurityErrorEvent.SECURITY_ERROR, socket_security_error);
}
//--------------------------------------------------------------------//
//ボタンバーのイベント関数
//--------------------------------------------------------------------//
private function tbbar_complete(a_event:FlexEvent):void{
Log.trace("i tbbar_complete:" + a_event);
//
a_event.currentTarget.selectedIndex = -1;
}
private function tbbar_item_click(a_event:ItemClickEvent):void{
Log.trace("i tbbar_item_click:" + a_event);
//
m_log_tarea.text += "[" + a_event.label + "]\n";
switch (a_event.item.type) {
//「FTP接続」ボタンが押されたら
case"login"://
m_ctrl_socket.connect(m_host, 21);
break;
//「ファイル選択」ボタンが押されたら
case"browse"://
m_freference.browse();
break;
//「アップロード」ボタンが押されたら
case"upload"://
//モードはバイナリ&パッシブに
send_command(m_ctrl_socket, "TYPE" + " " + "I");
send_command(m_ctrl_socket, "PASV");
break;
//「FTP切断」ボタンが押されたら
case"logout"://
send_command(m_ctrl_socket, "QUIT");
break;
//
case"eraselog"://
m_log_tarea.text = '';
break;
}
}
//--------------------------------------------------------------------//
//制御用ソケットのイベント関数
//--------------------------------------------------------------------//
private function ctrl_socket_connect(a_event:Event):void{
m_log_tarea.text += "ctrl_socket_connect" + a_event + "\n";
//認証
send_command(m_ctrl_socket, "USER" + " " + m_user);
send_command(m_ctrl_socket, "PASS" + " " + m_pass);
//ディレクトリ移動
send_command(m_ctrl_socket, "CWD" + " " + "/");
}
private function ctrl_socket_close(a_event:Event):void{
m_log_tarea.text += "ctrl_socket_close" + a_event + "\n";
}
private function ctrl_socket_data(a_event:ProgressEvent):void{
//レスポンスを取得
var responce:String = a_event.currentTarget.readUTFBytes(
a_event.currentTarget.bytesAvailable);
m_log_tarea.text += "ctrl_socket_data[\n" + responce + "]\n";
//レスポンスコードを取り出す
switch (responce.substr(0, 3)) {
//PASVへのレスポンスコードなら
case"227"://
//括弧内の文字列を取り出して「,(カンマ)」ごとに配列へ
var pasv:Array = responce.substring(
responce.indexOf("(") + 1, responce.indexOf(")")).split(",");
//最初の4つでIPアドレスを、残りの2つでポート番号を
var ip:String = pasv[0] + "." + pasv[1] + "." + pasv[2] + "." + pasv[3];
var port:int = parseInt(pasv[4]) * 256 + parseInt(pasv[5]);
//データ用ソケットで接続
m_data_socket.connect(ip, port);
//
break;
}
}
//--------------------------------------------------------------------//
//データ用ソケットのイベント関数
//--------------------------------------------------------------------//
private function data_socket_connect(a_event:Event):void{
m_log_tarea.text += "data_socket_connect" + a_event + "\n";
//選んだファイルを読み込む
if (m_freference.name != null && m_freference.name != "") {
send_command(m_ctrl_socket, "STOR" + " " + m_freference.name);
m_freference.load();
}
}
private function data_socket_close(a_event:Event):void{
m_log_tarea.text += "data_socket_close" + a_event + "\n";
}
private function data_socket_data(a_event:ProgressEvent):void{
var responce:String = a_event.currentTarget.readUTFBytes(
a_event.currentTarget.bytesAvailable);
m_log_tarea.text += "data_socket_data[\n" + responce + "]\n";
}
//--------------------------------------------------------------------//
//各ソケット共通のイベント関数
//--------------------------------------------------------------------//
private function socket_io_error(a_event:IOErrorEvent):void{
m_log_tarea.text += "socket_io_error" + a_event + "\n";
}
private function socket_security_error(a_event:SecurityErrorEvent):void{
m_log_tarea.text += "socket_security_error" + a_event + "\n";
}
//--------------------------------------------------------------------//
//FileReferenceのイベント関数
//--------------------------------------------------------------------//
private function freference_complete(a_event:Event):void{
m_log_tarea.text += "freference_complete" + a_event + "\n";
//選んだファイルの中身を転送
m_data_socket.writeBytes(m_freference.data, 0, m_freference.size);
m_data_socket.flush();
m_data_socket.close();
}
//--------------------------------------------------------------------//
//FTPコマンド送信用関数
//--------------------------------------------------------------------//
private function send_command(a_socket:Socket, arg:String):void{
m_log_tarea.text += "send_command " + arg + "\n";
//
a_socket.writeUTFBytes(arg + "\n");
a_socket.flush();
}
//--------------------------------------------------------------------//
}
}