Just some helpful links:
Understanding the security changes in Flash Player 10
Policy file changes in Flash Player 9 and Flash Player 10
Category: Flash Player
Flash and Amazon SimpleDB
I did some research about using Amazons SimpleDB service within a Flash based application and found these basic facts:
- http://sdb.amazonaws.com/crossdomain.xml is not available. This means no direct calls from Flash clients in browsers are possible!
- Even if it would be possible some day, you would need to find a secure way to deliver your AWS key to the Flash client.
- Using a web proxy is a solution that would cause a lot of traffic on your server.
So using Amazons SimpleDB for browser based Flash applications makes not much sense to me.
It might be more useful for Flash applications running on local machines like Flash projectors or Adobe AIR applications but there is still a security problem with hiding your AWS key.
Anyway, I found two ActionScript libraries that might be useful:
http://code.google.com/p/actionscript-simpledb-library/
http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1365
And this thread in Amazons discussion forums:
http://developer.amazonwebservices.com/connect/thread.jspa?threadID=19698
URLRequest with HTTP authentication
I found a good explanation how to support HTTP authentication with URLRequests here.
That’s the most interesting part:
Best I can tell, for some reason, this only works where request method is POST; the headers don’t get set with GET requests.
Interestingly, it also fails unless at least one URLVariables name-value pair gets packaged with the request, as indicated above. That’s why many of the examples you see out there (including mine) attach “name=John+Doe” — it’s just a placeholder for some data that URLRequest seems to require when setting any custom HTTP headers. Without it, even a properly authenticated POST request will also fail.
You’ll almost surely have to modify your crossdomain.xml file to accommodate the header(s) you’re going to be sending. In my case, I’m using this, which is a rather wide-open policy file in that it accepts from any domain, so in your case, you might want to limit things a bit more, depending on how security-conscious you are:
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> <allow-http-request-headers-from domain="*" headers="Authorization" /> </cross-domain-policy>… and that seems to work; more information on this one is available from Adobe here).
Apparently, Flash player version 9.0.115.0 completely blocks all Authorization headers (more information on this one here), so you’ll probably want to keep that in mind, too.
So this little code snippet explains the basics:
// Base64Encoder contained in Flex SDK import mx.utils.Base64Encoder; // Encode username and password var base64Encoder : Base64Encoder = new Base64Encoder(); base64Encoder.encode( "username:password" ); // Create authorization request header var urlRequestHeader : URLRequestHeader = new URLRequestHeader( "Authorization", "Basic " + base64Encoder.toString() ); // URLRequest setup var urlRequest : URLRequest = new URLRequest( "url" ); // Needs to send some data!! urlRequest.data = new URLVariables( "name=John+Doe" ); // Only supported with POST method!! urlRequest.method = URLRequestMethod.POST; // Apply authorization request header urlRequest.requestHeaders = new Array( urlRequestHeader );
Pixel Bender in Flash Player is not hardware accelerated
I just came across this little note http://theflashblog.com/?p=822 and thought that might help to get some clarification.
No flash events after PrintJob.start()
While developing the print functionality within a framework I got stuck on the behaviour of the Flash Player print implementation.
I couldn’t solve the following steps:
- Start the PrintJob and display the print dialog
- Procceed the following tasks for every print page:
- Load dynamic data into view templates (images, text, video…)
- Wait for the onLoadComplete event and add the displayed contents using PrintJob.addPage()
- Repeat for next page…
- Call PrintJob.send()
I really thought this would be an easy task but now I think it’s not possible. Several attempts later I figured out that after calling PrintJob.start() there is no way to use the flash event model! This means loading contents after calling PrintJob.start() is impossible!
WOW!
So I used a workaround: I create all the print pages like I mentioned before, but without calls on the PrintJob-API. I simply store every print page as BitmapData and afterwards I create the PrintJob within a loop.
Now I have multiple other problems:
- Hundreds of pages use a huge amount of RAM and often crash the application.
- The bitmap resolution sucks so printout text quality is unsatisfying and due to point 1 I have no chance to work with higher quality.
- I must avoid skript timeouts because after preparing all the bitmaps it takes much more that 15 seconds to add all these pages to a PrintJob.
Did I slip something?
Finally I created a small example to show you the disfunctionality (PrintJobProblem.as):
package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Rectangle; import flash.printing.PrintJob; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.utils.getTimer; /** * @author Markus Raab - derRaab.com / superclass.de */ public class PrintJobProblem extends Sprite { private var _numPrintOuts : int; private var _printOutIndex : int; private var _printJob : PrintJob; /** * Starts a event based printout test after a loop based * test has successfully finished. */ public function PrintJobProblem() { _numPrintOuts = 2; runLoopBasedTest( ); runEventBasedTest( ); } /** * Demonstrates and ensures the functionality. */ private function runLoopBasedTest() : void { _printJob = new PrintJob(); if ( _printJob.start() ) { for ( var i : int = 0; i < _numPrintOuts; i++ ) { addPage( i ); } _printJob.send(); } } /** * Demonstrates that after calling PrintJob.start() the internal * eventmodel doesn't dispatch any events at all. Everything is blocked * until the script times out. */ private function runEventBasedTest() : void { _printJob = new PrintJob(); if ( _printJob.start() ) { trace( getTimer(), "PrintJob.start() called" ); _printOutIndex = 0; startAddPagesOnEnterFrame(); } } private function startAddPagesOnEnterFrame() : void { addEventListener( Event.ENTER_FRAME, onAddPagesOnEnterFrameEvent ); } private function onAddPagesOnEnterFrameEvent(event : Event) : void { if ( _printOutIndex == _numPrintOuts ) { stopAddPagesOnEnterFrame(); _printJob.send(); trace( getTimer(), "PrintJob.send()" ); } else { addPage( _printOutIndex++ ); } } private function stopAddPagesOnEnterFrame() : void { removeEventListener( Event.ENTER_FRAME, onAddPagesOnEnterFrameEvent ); } private function addPage( pageIndex : int ) : void { var page : Sprite = createPrintPage( pageIndex ); stage.addChild( page ); var viewWidth : Number = page.width; var viewHeight : Number = page.height; var scaleX : Number = _printJob.pageWidth / viewWidth; var scaleY : Number = _printJob.pageHeight / viewHeight; var scale : Number = Math.min( scaleX, scaleY ); page.scaleX = page.scaleY = scale; var printRect : Rectangle = new Rectangle( 0, 0, viewWidth, viewHeight ); try { _printJob.addPage( page, printRect ); } catch( e: Error ) { trace( getTimer(), "PrintJob.addPage() failed" ); } stage.removeChild( page ); } private function createPrintPage( pageIndex : int) : Sprite { var page : Sprite = new Sprite(); var textField : TextField = new TextField(); textField.autoSize = TextFieldAutoSize.LEFT; textField.text = "Page " + pageIndex; page.addChild( textField ); return page; } } }
Grant Skinners 50 reasons why AS 3 kicks ass
I found great slides on Grant Skinners blog. They give a quick introduction in AS 3 and it’s core benefits!
50 reasons why AS 3 kicks ass (Grant Skinner)
Also a must read for developers!
Update: And he also added more slides from a workshop here
Adobe Flash Player 9 Security Changes
As a developer you should definitely have a look at this paper
Flash Player GarbageCollection Problem
Grant Skinners post about the (for me) unknown problem with the Flash Player GarbageCollection is definitely a must read!
One of my projects also has problems with external loaded contents wasting memory.
Adobe should make some noise
I really love the work of André Michelle and Joa Ebert, especially if it’s about some cool audio stuff! But the Flash Player doesn’t provide enhanced audio support, actually it seems to get worse.
So we all should support the Adobe, MAKE SOME NOISE campain!
How to add MouseWheel support on Mac OS Flash Player
Gabriel Bucknail created almost a year ago a SWFObject add-on to bring MouseWheel support to the Mac OS X Flash Player. Seems to be still up to date: AS2-Solution or AS3-Solution