Simple File transfer application using stratus
This is just a test to see if it is possible
/*
*
* Written by: Danel Kirch 15-jul-2010 (danel@flashguru.se)
*
* Im not the most skilled programmer out there, but this would be my
* try to create something interesting and inspirational. Im aware of
* that there are many other ways (better and worse) to do some of the
* things i've done here, but take is as it is! :)
*
* You may modify this code and use it in anyway you'd like to.
*
* Demo: http://as3breeze.com/air-app-airtransfer-f2p-ex/
*/
import flash.events.Event;
import flash.events.NativeDragEvent;
import flash.filesystem.File;
import flash.display.NativeWindow;
import flash.desktop.NativeDragManager;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.net.URLLoader;
import flash.events.ProgressEvent;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.display.Loader;
import com.adobe.images.JPGEncoder;
import com.adobe.images.PNGEncoder;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.MouseEvent;
droper.stop();
const addy:String = "rtmfp://stratus.adobe.com/";
const nyckel:String = "StratusKey"; // Get it at: https://www.adobe.com/cfusion/entitlement/index.cfm?e=stratus
var nc:NetConnection;
var netGroup:NetGroup;
var connected:Boolean = false;
var message:Object = new Object();
var fs:FileStream = new FileStream();
var nickName:String = "nickName"+Math.floor(Math.random()*9898);
mcAccept.visible = false;
mcAccept.buttonMode = true;
connect();
function connect():void {
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,netStatus,false,0,true);
nc.connect(addy+nyckel);
}
// Handle netstatus
function netStatus(event:NetStatusEvent):void {
switch (event.info.code) {
case "NetConnection.Connect.Success" :
tf.text = "Ready for use!";
setUp();
tfNickName.text = nickName;
stage.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, fileIn,false,0,true);
stage.addEventListener(NativeDragEvent.NATIVE_DRAG_EXIT, fileExit,false,0,true);
stage.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, fileOk,false,0,true);
break;
case "NetGroup.Connect.Success" :
connected = true;
break;
case "NetGroup.Posting.Notify" :
rMess(event.info.message);
break;
}
}
// Handle file thats dragged in
function fileIn(n:NativeDragEvent):void{
if(n.clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)){
var files:Array = n.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
if(files.length == 1){
NativeDragManager.acceptDragDrop(this);
droper.gotoAndStop(2);
}
}
}
// handle function if file is not dropped on app
function fileExit(n:NativeDragEvent):void{
droper.gotoAndStop(1);
}
// handle file when it is dropped
function fileOk(n:NativeDragEvent):void{
var files:Array = n.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
sMess(files[0]);
droper.gotoAndStop(2);
}
// Setup group
function setUp():void {
var groupspec:GroupSpecifier = new GroupSpecifier("AIRTransferGroup");
groupspec.serverChannelEnabled = true;
groupspec.postingEnabled = true;
netGroup = new NetGroup(nc,groupspec.groupspecWithAuthorizations());
netGroup.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
}
// send file
function sMess(_filen:*):void {
nickName = tfNickName.text;
message.nickname = nickName;
message.ext = _filen.extension;
message.name = _filen.name;
switch(_filen.extension.toLowerCase()){
case "txt":
case "xml":
fs.open(_filen,FileMode.READ);
var dd = fs.readUTFBytes(fs.bytesAvailable);
fs.close();
message.sender = netGroup.convertPeerIDToGroupAddress(nc.nearID);
message.datan = dd;
netGroup.post(message);
break;
case "jpg":
case "png":
case "jpeg":
var loa:Loader = new Loader();
loa.contentLoaderInfo.addEventListener(Event.COMPLETE, bildenLaddad,false,0,true);
loa.load(new URLRequest(_filen.url));
break;
}
}
// load the image and post it
function bildenLaddad(e:Event):void{
switch(message.ext){
case "jpg":
case "jpeg":
var jpgenc:JPGEncoder = new JPGEncoder(100);
message.bild = jpgenc.encode(getBitmapData(e.target.content));
break;
case "png":
message.bild = PNGEncoder.encode(getBitmapData(e.target.content));
trace(message.bild);
break;
}
netGroup.post(message);
}
// receive message
function rMess(message:*):void {
var ext:String = message.ext;
var nam:String = "FT"+Math.round(Math.random()*2423)+message.name;
var _datan:String = message.datan;
var _bilden = message.bild;
tfFile.appendText("\n"+nam);
mcAccept.tfIncoming.text = message.nickname +" is sending you a file\n Saving on desktop: "+File.desktopDirectory.url + "/"+nam;
mcAccept.visible = true;
mcAccept.addEventListener(MouseEvent.MOUSE_UP, accepted);
function accepted(m:MouseEvent):void{
fs.open(File.desktopDirectory.resolvePath(nam),FileMode.WRITE);
switch(ext){
case "txt":
case "xml":
fs.writeUTFBytes(_datan);
break;
case "jpg":
case "png":
fs.writeBytes(_bilden,0,_bilden.length);
break;
}
mcAccept.visible = false;
}
fs.close();
}
// get image bitmapdata
function getBitmapData(_image:Bitmap):BitmapData{
var bildBitmapData:BitmapData = new BitmapData(_image.width, _image.height);
bildBitmapData.draw(_image);
return bildBitmapData;
}
+