30Jan

[AS 3] Flash Cookies with the Local Shared Object

No comments

Since the sharedObject method in Actionscript has proved itself to be very useful in the past (like my .mp3 player to play across multiple .html pages), I wondered how it was implemented in Actionscript 3. I found some nice code over at adobe and made some slight modifications so you wouldn’t have to refresh your movie. To interact, just type in some text and then hit the save button to save this snippet on your machine. Once saved, that snippet will display in the movie below until you clear it out.

Here is my document class ObjectSharing.as

package
{
	/*
	Original Source
	http://livedocs.adobe.com/flex/2/langref/flash/net/SharedObject.html#includeExamplesSummary
	*/

	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.NetStatusEvent;
	import flash.net.SharedObject;
	import flash.net.SharedObjectFlushStatus;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFieldType;
	import flash.text.TextFormat;

	public class ObjectSharing extends Sprite {  

		private var mySo:SharedObject;

		public function ObjectSharing()
		{
			buildUI();
			saveBtn.addEventListener(MouseEvent.CLICK, saveValue);
			clearBtn.addEventListener(MouseEvent.CLICK, clearValue);

			mySo = SharedObject.getLocal("application-name");
			output.appendText("SharedObject loaded...\n");
			output.appendText("loaded value: " + mySo.data.savedValue + "\n\n");

			if ( mySo.data.savedValue )
			{
				soStatus.text = mySo.data.savedValue;
			}
			else
			{
				soStatus.text = "undefined";
			}

    	}  

		private function saveValue(event:MouseEvent):void {
        	output.appendText("saving value...\n");
        	mySo.data.savedValue = input.text;

			var flushStatus:String = null;

			try
			{
            	flushStatus = mySo.flush(10000);
        	} catch (error:Error) {
            	output.appendText("Error...Could not write SharedObject to disk\n");
			}

        	if (flushStatus != null)
			{
            	switch (flushStatus)
				{
                	case SharedObjectFlushStatus.PENDING:
                    	output.appendText("Requesting permission to save object...\n");
                    	mySo.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
                    	break;
					case SharedObjectFlushStatus.FLUSHED:
                    	output.appendText("Value flushed to disk.\n");
                    	break;
				}
			}
        	output.appendText("\n");

			soStatus.text = mySo.data.savedValue;
		}

		private function clearValue(event:MouseEvent):void {
        	output.appendText("Cleared saved value...Reload SWF and the value should be \"undefined\".\n\n");
        	delete mySo.data.savedValue;

			soStatus.text = "[deleted] value is: " + mySo.data.savedValue;
    	}

		private function onFlushStatus(event:NetStatusEvent):void {
			output.appendText("User closed permission dialog...\n");
			switch (event.info.code)
			{
            	case "SharedObject.Flush.Success":
                	output.appendText("User granted permission -- value saved.\n");
                	break;
            	case "SharedObject.Flush.Failed":
                	output.appendText("User denied permission -- value not saved.\n");
                	break;
        	}  

			output.appendText("\n");

        	mySo.removeEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
		}  

    	// UI elements
    	private var inputLbl:TextField;
    	private var input:TextField;
    	private var output:TextField;
		private var soStatus:TextField;
		private var soStatusLbl:TextField;
   	 	private var saveBtn:Sprite;
    	private var clearBtn:Sprite;

    	private function buildUI():void
		{
			// White Text Formatting
			var whiteFormat:TextFormat = new TextFormat();
			whiteFormat.font = "Arial";
			whiteFormat.color = 0xffffff;
            whiteFormat.size = 10;
            whiteFormat.underline = false;

			// Black Text Formatting
			var blackFormat:TextFormat = new TextFormat();
			blackFormat.font = "Arial";
			blackFormat.color = 0x000000;
            blackFormat.size = 12;
            blackFormat.underline = false;

			// Small Black Text Formatting
			var smallBlackFormat:TextFormat = new TextFormat();
			smallBlackFormat.font = "Arial";
			smallBlackFormat.color = 0x000000;
            smallBlackFormat.size = 10;
            smallBlackFormat.underline = false;

			// New Shared Object Name
			var soFormat:TextFormat = new TextFormat();
			soFormat.font = "Arial";
			soFormat.color = 0x336699;
            soFormat.size = 12;
            soFormat.underline = false;

			// New Output Shared Object
			var soOutFormat:TextFormat = new TextFormat();
			soOutFormat.font = "Arial";
			soOutFormat.color = 0x009900;
            soOutFormat.size = 14;
            soOutFormat.underline = false;

        	// input label
        	inputLbl = new TextField();
			inputLbl.defaultTextFormat = whiteFormat;
        	addChild(inputLbl);
        	inputLbl.x = 10;
        	inputLbl.y = 10;
        	inputLbl.text = "Value to save:";

        	// input TextField
       		input = new TextField();
			input.defaultTextFormat = soFormat;
        	addChild(input);
        	input.x = 80;
        	input.y = 10;
        	input.width = 100;
        	input.height = 20;
        	input.border = true;
        	input.background = true;
        	input.type = TextFieldType.INPUT;

        	// output TextField
        	output = new TextField();
			output.defaultTextFormat = smallBlackFormat;
        	addChild(output);
        	output.x = 10;
        	output.y = 35;
            output.width = 250;
            output.height = 250;
            output.multiline = true;
            output.wordWrap = true;
            output.border = true;
            output.background = true;

			// SharedObject Status Field
			soStatus = new TextField();
			soStatus.defaultTextFormat = soOutFormat;
			addChild(soStatus);
			soStatus.x = 300;
        	soStatus.y = 35;
            soStatus.width = 200;
            soStatus.height = 30;
            soStatus.multiline = true;
            soStatus.wordWrap = true;
            soStatus.border = true;
            soStatus.background = true;

			soStatusLbl = new TextField();
			soStatusLbl.defaultTextFormat = whiteFormat;
			addChild(soStatusLbl);
			soStatusLbl.x = 300;
			soStatusLbl.y = 15;
			soStatusLbl.width = 250;
			soStatusLbl.height = 20;
			soStatusLbl.text = "Current Value of Shared Object:";
			soStatusLbl.selectable = false;

            // Save button
            saveBtn = new Sprite();
            addChild(saveBtn);
            saveBtn.x = 190;
            saveBtn.y = 10;
            saveBtn.useHandCursor = true;
            saveBtn.graphics.lineStyle(1);
            saveBtn.graphics.beginFill(0xcccccc);
            saveBtn.graphics.drawRoundRect(0, 0, 30, 20, 5, 5);
            var saveLbl:TextField = new TextField();
			saveLbl.defaultTextFormat = smallBlackFormat;
            saveBtn.addChild(saveLbl);
            saveLbl.text = "Save";
            saveLbl.selectable = false;

            // Clear button
            clearBtn = new Sprite();
            addChild(clearBtn);
            clearBtn.x = 230;
            clearBtn.y = 10;
            clearBtn.useHandCursor = true;
            clearBtn.graphics.lineStyle(1);
            clearBtn.graphics.beginFill(0xcccccc);
            clearBtn.graphics.drawRoundRect(0, 0, 30, 20, 5, 5);
            var clearLbl:TextField = new TextField();
			clearLbl.defaultTextFormat = smallBlackFormat;
            clearBtn.addChild(clearLbl);
            clearLbl.text = "Clear";
            clearLbl.selectable = false;
        }
    }
}

Share/Save/Bookmark

Wednesday, January 30th, 2008 at 10:38 am and is filed under Actionscript 3, Data Sharing. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a reply