Permalink
Browse files

added adobe libraries and bunches of changes

  • Loading branch information...
1 parent 2e1ed76 commit 711c3bd72f9bd4fe3e8de9360ed94a076c5806d1 @schacon committed May 28, 2008
Showing with 9,169 additions and 24 deletions.
  1. +1 −0 .gitignore
  2. BIN bin-debug/Git.swf
  3. +59 −0 src/CommitRenderer.mxml
  4. +81 −19 src/Git.mxml
  5. +16 −0 src/LogView.mxml
  6. +23 −5 src/chacon/git/AsGit.as
  7. +20 −0 src/chacon/git/AsGitAuthor.as
  8. +56 −0 src/chacon/git/AsGitCommit.as
  9. +9 −0 src/chacon/git/AsGitObject.as
  10. +15 −0 src/chacon/utils/Callback.as
  11. +256 −0 src/com/adobe/crypto/MD5.as
  12. +268 −0 src/com/adobe/crypto/SHA1.as
  13. +255 −0 src/com/adobe/crypto/SHA224.as
  14. +260 −0 src/com/adobe/crypto/SHA256.as
  15. +117 −0 src/com/adobe/crypto/WSSEUsernameToken.as
  16. +66 −0 src/com/adobe/errors/IllegalStateError.as
  17. +50 −0 src/com/adobe/fileformats/vcard/Address.as
  18. +42 −0 src/com/adobe/fileformats/vcard/Email.as
  19. +42 −0 src/com/adobe/fileformats/vcard/Phone.as
  20. +57 −0 src/com/adobe/fileformats/vcard/VCard.as
  21. +249 −0 src/com/adobe/fileformats/vcard/VCardParser.as
  22. +42 −0 src/com/adobe/images/BitString.as
  23. +651 −0 src/com/adobe/images/JPGEncoder.as
  24. +144 −0 src/com/adobe/images/PNGEncoder.as
  25. +58 −0 src/com/adobe/net/DynamicURLLoader.as
  26. +79 −0 src/com/adobe/net/IURIResolver.as
  27. +193 −0 src/com/adobe/net/MimeTypeMap.as
  28. +2,469 −0 src/com/adobe/net/URI.as
  29. +142 −0 src/com/adobe/net/URIEncodingBitmap.as
  30. +204 −0 src/com/adobe/net/proxies/RFC2817Socket.as
  31. +88 −0 src/com/adobe/serialization/json/JSON.as
  32. +224 −0 src/com/adobe/serialization/json/JSONDecoder.as
  33. +302 −0 src/com/adobe/serialization/json/JSONEncoder.as
  34. +90 −0 src/com/adobe/serialization/json/JSONParseError.as
  35. +107 −0 src/com/adobe/serialization/json/JSONToken.as
  36. +70 −0 src/com/adobe/serialization/json/JSONTokenType.as
  37. +550 −0 src/com/adobe/serialization/json/JSONTokenizer.as
  38. +190 −0 src/com/adobe/utils/ArrayUtil.as
  39. +702 −0 src/com/adobe/utils/DateUtil.as
  40. +90 −0 src/com/adobe/utils/DictionaryUtil.as
  41. +69 −0 src/com/adobe/utils/IntUtil.as
  42. +77 −0 src/com/adobe/utils/NumberFormatter.as
  43. +273 −0 src/com/adobe/utils/StringUtil.as
  44. +171 −0 src/com/adobe/utils/XMLUtil.as
  45. +51 −0 src/com/adobe/webapis/ServiceBase.as
  46. +111 −0 src/com/adobe/webapis/URLLoaderBase.as
  47. +78 −0 src/com/adobe/webapis/events/ServiceEvent.as
  48. BIN src/img/.DS_Store
  49. BIN src/img/user.jpg
  50. +2 −0 src/style.css
View
1 .gitignore
@@ -0,0 +1 @@
+bin-debug/*
View
BIN bin-debug/Git.swf
Binary file not shown.
View
59 src/CommitRenderer.mxml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="40"
+ horizontalScrollPolicy="off" verticalScrollPolicy="off">
+ <mx:Style source="style.css"/>
+ <mx:Script>
+ <![CDATA[
+ import com.adobe.crypto.MD5;
+ import chacon.utils.Callback;
+
+ public function getImageSource(email:String):String {
+ var hash:String = MD5.hash(email);
+
+ var dir:File = File.applicationStorageDirectory.resolvePath('icon_cache');
+ if(!dir.exists) { dir.createDirectory(); }
+
+ var diskUrl:File = File.applicationStorageDirectory.resolvePath('icon_cache/' + hash + '.jpg');
+ if(!diskUrl.exists) {
+ // !! copy temp icon there !!
+ var defIcon:File = File.applicationDirectory.resolvePath('img/user.jpg');
+ defIcon.copyTo(diskUrl);
+
+ var iconUrl:String = "http://www.gravatar.com/avatar.php?size=50&gravatar_id=" + hash;
+ var request:URLRequest = new URLRequest(iconUrl);
+ var loader:URLLoader = new URLLoader();
+ loader.dataFormat = URLLoaderDataFormat.BINARY;
+ loader.addEventListener(Event.COMPLETE, Callback.create(onComplete, diskUrl));
+ loader.addEventListener(IOErrorEvent.IO_ERROR, handleIOError);
+ loader.load( request );
+ }
+
+ return diskUrl.url;
+ }
+
+ private function handleIOError(evt:IOErrorEvent):void {
+ trace('IO Err:' + evt.text);
+ }
+
+ private function onComplete(evt:Event, diskUrl:File):void
+ {
+ trace("DOWNLOADED FILE");
+ var loader:URLLoader = URLLoader(evt.target);
+ trace(loader.dataFormat);
+ trace(loader.bytesTotal);
+ var fileStream:FileStream = new FileStream();
+ fileStream.open(diskUrl, FileMode.WRITE);
+ fileStream.writeBytes(loader.data);
+ fileStream.close();
+ }
+ ]]>
+ </mx:Script>
+ <mx:HBox width="100%" height="100%"
+ styleName="commit">
+ <mx:Image width="40" height="40" source="{getImageSource(data.author.email)}"/>
+ <mx:VBox verticalGap="0">
+ <mx:Text text="{data.message}"/>
+ <mx:Text text="by {data.author.name} on {data.author.date}" />
+ </mx:VBox>
+ </mx:HBox>
+</mx:Canvas>
View
100 src/Git.mxml
@@ -1,41 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
- layout="absolute" width="800" height="600" initialize="initApp();">
+ layout="absolute" width="800" height="600" initialize="initApp()"
+ verticalScrollPolicy="off"
+ horizontalScrollPolicy="off">
+
+ <mx:Style source="style.css"/>
+
<mx:Script>
<![CDATA[
-
+ import mx.core.UIComponent;
+ import mx.controls.Image;
+ import mx.collections.ArrayCollection;
+ import chacon.utils.ByteArrayPack;
+ import chacon.git.*;
+
// TODO :
// * browse
+ // * clear icon cache button
+ // * deal with pack files
+ // * cache trees and commits in sqlite
+ //
+ // * init
// * clone
// * add
// * commit
- import chacon.utils.ByteArrayPack;
- import chacon.git.AsGit;
-
private var git:AsGit;
+ private var gitDir:String;
public function initApp():void {
- git = new AsGit('/Users/schacon/projects/simplegit');
- showHead();
+ changeGitPath('/Users/schacon/projects/simplegit');
+ }
+
+ public function changeGitPath(path:String):void {
+ var dir:String = path;
+ git = new AsGit(dir);
+ gitDir = dir;
}
- public function showHead():void {
- output.text = git.readObject(git.readGitFile(git.headRef()));
+ public function initLogs():void {
+ switchDir.label = gitDir;
+ //tree.directory = new File(dir);
+ fillLog();
}
- public function runHex():void {
- // define the ByteArray
- var bytes:ByteArray = new ByteArray();
- bytes.writeMultiByte(input.text, 'iso-8859-1');
- trace("bytes length is: " + bytes.length); // display the length
- var packHex:ByteArray = ByteArrayPack.packHex(bytes);
- output.text = packHex.toString();
- bytes = ByteArrayPack.unpackHex(packHex);
- output2.text = bytes.toString();
+ public function fillLog():void {
+ var logArr:Array = git.log();
+ log.dataProvider = new ArrayCollection(logArr.reverse());
}
+
+ public function switchDirectories():void {
+ viewstack.selectedIndex = 1;
+ }
+
+ public function trySwitch():void {
+ var path:String = tree.selectedPath;
+ trace(path);
+ var selectPath:File = new File(path);
+ if(selectPath.isDirectory) {
+ if(selectPath.resolvePath('.git').exists) {
+ changeGitPath(path);
+ initLogs();
+ viewstack.selectedIndex = 0;
+ }
+ }
+ }
+
+ public function showLog():void {
+ output.text = log.selectedItem.raw;
+ output.text += git.readObject(log.selectedItem.parents[0]).raw;
+ }
+
]]>
</mx:Script>
- <mx:Text id="output" x="183" y="107" text="f2"/>
+
+ <mx:ViewStack x="0" y="0" id="viewstack" width="100%" height="100%">
+
+ <mx:VBox height="100%" width="100%" initialize="initLogs()"
+ paddingLeft="10" paddingRight="10" paddingTop="10" paddingBottom="10">
+ <mx:HBox width="100%" height="30">
+ <mx:Image source="/img/git-logo.png"/>
+ <mx:Button id="switchDir" click="switchDirectories()" label="Choose Directory"/>
+ <mx:Spacer width="100%"/>
+ <mx:Text text="Branch:"/>
+ <mx:ComboBox></mx:ComboBox>
+ </mx:HBox>
+ <mx:HBox width="100%" height="100%">
+ <mx:List id="log" width="250" height="100%" click="showLog()" itemRenderer="CommitRenderer"/>
+ <mx:Text id="output" text="output" width="100%" height="100%"/>
+ </mx:HBox>
+ </mx:VBox>
+
+ <mx:TitleWindow id="dirChooser" width="100%" height="100%">
+ <mx:VBox width="100%" height="100%">
+ <mx:FileSystemTree id="tree" width="100%" height="100%"/>
+ <mx:Button id="chooseDir" click="trySwitch()" label="Choose Directory"/>
+ </mx:VBox>
+ </mx:TitleWindow>
+
+ </mx:ViewStack>
</mx:WindowedApplication>
View
16 src/LogView.mxml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%">
+ <mx:Script>
+ <![CDATA[
+ public function fillLog():void {
+ var logArr:Array = git.log();
+ log.dataProvider = new ArrayCollection(logArr.reverse());
+ }
+ ]]>
+ </mx:Script>
+
+ <mx:HBox width="100%" height="100%">
+ <mx:List id="log" width="250" height="100%" itemRenderer="CommitRenderer"/>
+ <mx:Text id="output" text="output" width="100%" height="100%"/>
+ </mx:HBox>
+</mx:Canvas>
View
28 src/chacon/git/AsGit.as
@@ -1,6 +1,7 @@
package chacon.git
{
import chacon.utils.ByteArrayPack;
+ import chacon.git.*;
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
@@ -15,11 +16,23 @@ package chacon.git
gitDirectory = gitRepoDirectory + '/.git'
}
- public function readObject(sha:String):String {
+ public function log():Array {
+ var commit:AsGitCommit;
+ var sha:String = readGitFile(headRef());
+
+ var arrCommits:Array = new Array;
+ while(sha) {
+ commit = readObject(sha) as AsGitCommit;
+ arrCommits.unshift(commit);
+ sha = commit.parents[0];
+ }
+ return arrCommits;
+ }
+
+ public function readObject(sha:String):Object {
sha = sha.substr(0, 40);
var dir:String = sha.substr(0,2);
var fname:String = sha.substr(2);
- trace('objects/' + dir + '/' + fname);
var commit:ByteArray = readObjectBytes('objects/' + dir + '/' + fname);
commit.uncompress();
@@ -41,9 +54,14 @@ package chacon.git
}
}
}
- trace(header);
- trace(body);
- return body.toString();
+
+ var arrHeader:Array = header.toString().split(' ');
+ if(arrHeader[0] == 'commit') {
+ var object:AsGitCommit = new AsGitCommit(sha, body.toString(), arrHeader[1]);
+ return object;
+ }
+
+ return new AsGitObject;
}
public function readObjectBytes(file:String):ByteArray {
View
20 src/chacon/git/AsGitAuthor.as
@@ -0,0 +1,20 @@
+package chacon.git
+{
+ public class AsGitAuthor
+ {
+
+ public var name:String;
+ public var email:String;
+ public var date:Date;
+
+ public function AsGitAuthor(strAuthor:String):void
+ {
+ var author:Array = strAuthor.match(/(.*?) <(.*?)> (\d+) (.*)/)
+ name = author[1];
+ email = author[2];
+ date = new Date();
+ date.setTime(Number(author[3]) * 1000); // convert from seconds to milliseconds
+ }
+
+ }
+}
View
56 src/chacon/git/AsGitCommit.as
@@ -0,0 +1,56 @@
+package chacon.git
+{
+ import chacon.git.*;
+ import chacon.utils.ByteArrayPack;
+ import flash.utils.ByteArray;
+
+ public class AsGitCommit extends AsGitObject
+ {
+ public var tree:String;
+ public var parents:Array;
+
+ public var author_string:String;
+ public var committer_string:String;
+ public var message:String;
+
+ public var author:AsGitAuthor;
+ public var committer:AsGitAuthor;
+
+ public function AsGitCommit(shaStr:String, body:String, sizeStr:String) {
+ sha = shaStr;
+ raw = body;
+ size = sizeStr;
+ message = '';
+ parents = new Array();
+ processRaw();
+ }
+
+ private function processRaw():void {
+ var arr:Array = raw.split("\n");
+ var values:Array;
+
+ for(var i:int = 0; i < arr.length; i++) {
+ trace(arr[i]);
+ values = arr[i].match(/(.*?) (.*)/);
+ if(values) {
+ if(values[1] == 'tree') {
+ tree = values[2];
+ } else if(values[1] == 'parent') {
+ parents.push(values[2]);
+ } else if(values[1] == 'author') {
+ author_string = values[2];
+ author = new AsGitAuthor(author_string);
+ } else if(values[1] == 'committer') {
+ committer_string = values[2];
+ committer = new AsGitAuthor(committer_string);
+ } else {
+ if(arr[i]) {
+ message += arr[i];
+ }
+ }
+ }
+ }
+ }
+ }
+
+}
View
9 src/chacon/git/AsGitObject.as
@@ -0,0 +1,9 @@
+package chacon.git
+{
+ public class AsGitObject
+ {
+ public var sha:String;
+ public var raw:String;
+ public var size:String;
+ }
+}
View
15 src/chacon/utils/Callback.as
@@ -0,0 +1,15 @@
+package chacon.utils
+{
+ public class Callback
+ {
+
+ public static function create(handler:Function, ...args):Function {
+
+ return function(...innerArgs):void {
+ handler.apply(this,innerArgs.concat(args));
+ }
+
+ }
+
+ }
+}
View
256 src/com/adobe/crypto/MD5.as
@@ -0,0 +1,256 @@
+/*
+Adobe Systems Incorporated(r) Source Code License Agreement
+Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+Please read this Source Code License Agreement carefully before using
+the source code.
+
+Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable copyright license, to reproduce,
+prepare derivative works of, publicly display, publicly perform, and
+distribute this source code and such derivative works in source or
+object code form without any attribution requirements.
+
+The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+derived from the source code without prior written permission.
+
+You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+against any loss, damage, claims or lawsuits, including attorney's
+fees that arise or result from your use or distribution of the source
+code.
+
+THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto {
+
+ import com.adobe.utils.IntUtil;
+
+ /**
+ * The MD5 Message-Digest Algorithm
+ *
+ * Implementation based on algorithm description at
+ * http://www.faqs.org/rfcs/rfc1321.html
+ */
+ public class MD5 {
+
+ /**
+ * Performs the MD5 hash algorithm on a string.
+ *
+ * @param s The string to hash
+ * @return A string containing the hash value of s
+ * @langversion ActionScript 3.0
+ * @playerversion Flash 9.0
+ * @tiptext
+ */
+ public static function hash( s:String ):String {
+ // initialize the md buffers
+ var a:int = 1732584193;
+ var b:int = -271733879;
+ var c:int = -1732584194;
+ var d:int = 271733878;
+
+ // variables to store previous values
+ var aa:int;
+ var bb:int;
+ var cc:int;
+ var dd:int;
+
+ // create the blocks from the string and
+ // save the length as a local var to reduce
+ // lookup in the loop below
+ var x:Array = createBlocks( s );
+ var len:int = x.length;
+
+ // loop over all of the blocks
+ for ( var i:int = 0; i < len; i += 16) {
+ // save previous values
+ aa = a;
+ bb = b;
+ cc = c;
+ dd = d;
+
+ // Round 1
+ a = ff( a, b, c, d, x[i+ 0], 7, -680876936 ); // 1
+ d = ff( d, a, b, c, x[i+ 1], 12, -389564586 ); // 2
+ c = ff( c, d, a, b, x[i+ 2], 17, 606105819 ); // 3
+ b = ff( b, c, d, a, x[i+ 3], 22, -1044525330 ); // 4
+ a = ff( a, b, c, d, x[i+ 4], 7, -176418897 ); // 5
+ d = ff( d, a, b, c, x[i+ 5], 12, 1200080426 ); // 6
+ c = ff( c, d, a, b, x[i+ 6], 17, -1473231341 ); // 7
+ b = ff( b, c, d, a, x[i+ 7], 22, -45705983 ); // 8
+ a = ff( a, b, c, d, x[i+ 8], 7, 1770035416 ); // 9
+ d = ff( d, a, b, c, x[i+ 9], 12, -1958414417 ); // 10
+ c = ff( c, d, a, b, x[i+10], 17, -42063 ); // 11
+ b = ff( b, c, d, a, x[i+11], 22, -1990404162 ); // 12
+ a = ff( a, b, c, d, x[i+12], 7, 1804603682 ); // 13
+ d = ff( d, a, b, c, x[i+13], 12, -40341101 ); // 14
+ c = ff( c, d, a, b, x[i+14], 17, -1502002290 ); // 15
+ b = ff( b, c, d, a, x[i+15], 22, 1236535329 ); // 16
+
+ // Round 2
+ a = gg( a, b, c, d, x[i+ 1], 5, -165796510 ); // 17
+ d = gg( d, a, b, c, x[i+ 6], 9, -1069501632 ); // 18
+ c = gg( c, d, a, b, x[i+11], 14, 643717713 ); // 19
+ b = gg( b, c, d, a, x[i+ 0], 20, -373897302 ); // 20
+ a = gg( a, b, c, d, x[i+ 5], 5, -701558691 ); // 21
+ d = gg( d, a, b, c, x[i+10], 9, 38016083 ); // 22
+ c = gg( c, d, a, b, x[i+15], 14, -660478335 ); // 23
+ b = gg( b, c, d, a, x[i+ 4], 20, -405537848 ); // 24
+ a = gg( a, b, c, d, x[i+ 9], 5, 568446438 ); // 25
+ d = gg( d, a, b, c, x[i+14], 9, -1019803690 ); // 26
+ c = gg( c, d, a, b, x[i+ 3], 14, -187363961 ); // 27
+ b = gg( b, c, d, a, x[i+ 8], 20, 1163531501 ); // 28
+ a = gg( a, b, c, d, x[i+13], 5, -1444681467 ); // 29
+ d = gg( d, a, b, c, x[i+ 2], 9, -51403784 ); // 30
+ c = gg( c, d, a, b, x[i+ 7], 14, 1735328473 ); // 31
+ b = gg( b, c, d, a, x[i+12], 20, -1926607734 ); // 32
+
+ // Round 3
+ a = hh( a, b, c, d, x[i+ 5], 4, -378558 ); // 33
+ d = hh( d, a, b, c, x[i+ 8], 11, -2022574463 ); // 34
+ c = hh( c, d, a, b, x[i+11], 16, 1839030562 ); // 35
+ b = hh( b, c, d, a, x[i+14], 23, -35309556 ); // 36
+ a = hh( a, b, c, d, x[i+ 1], 4, -1530992060 ); // 37
+ d = hh( d, a, b, c, x[i+ 4], 11, 1272893353 ); // 38
+ c = hh( c, d, a, b, x[i+ 7], 16, -155497632 ); // 39
+ b = hh( b, c, d, a, x[i+10], 23, -1094730640 ); // 40
+ a = hh( a, b, c, d, x[i+13], 4, 681279174 ); // 41
+ d = hh( d, a, b, c, x[i+ 0], 11, -358537222 ); // 42
+ c = hh( c, d, a, b, x[i+ 3], 16, -722521979 ); // 43
+ b = hh( b, c, d, a, x[i+ 6], 23, 76029189 ); // 44
+ a = hh( a, b, c, d, x[i+ 9], 4, -640364487 ); // 45
+ d = hh( d, a, b, c, x[i+12], 11, -421815835 ); // 46
+ c = hh( c, d, a, b, x[i+15], 16, 530742520 ); // 47
+ b = hh( b, c, d, a, x[i+ 2], 23, -995338651 ); // 48
+
+ // Round 4
+ a = ii( a, b, c, d, x[i+ 0], 6, -198630844 ); // 49
+ d = ii( d, a, b, c, x[i+ 7], 10, 1126891415 ); // 50
+ c = ii( c, d, a, b, x[i+14], 15, -1416354905 ); // 51
+ b = ii( b, c, d, a, x[i+ 5], 21, -57434055 ); // 52
+ a = ii( a, b, c, d, x[i+12], 6, 1700485571 ); // 53
+ d = ii( d, a, b, c, x[i+ 3], 10, -1894986606 ); // 54
+ c = ii( c, d, a, b, x[i+10], 15, -1051523 ); // 55
+ b = ii( b, c, d, a, x[i+ 1], 21, -2054922799 ); // 56
+ a = ii( a, b, c, d, x[i+ 8], 6, 1873313359 ); // 57
+ d = ii( d, a, b, c, x[i+15], 10, -30611744 ); // 58
+ c = ii( c, d, a, b, x[i+ 6], 15, -1560198380 ); // 59
+ b = ii( b, c, d, a, x[i+13], 21, 1309151649 ); // 60
+ a = ii( a, b, c, d, x[i+ 4], 6, -145523070 ); // 61
+ d = ii( d, a, b, c, x[i+11], 10, -1120210379 ); // 62
+ c = ii( c, d, a, b, x[i+ 2], 15, 718787259 ); // 63
+ b = ii( b, c, d, a, x[i+ 9], 21, -343485551 ); // 64
+
+ a += aa;
+ b += bb;
+ c += cc;
+ d += dd;
+ }
+
+ // Finish up by concatening the buffers with their hex output
+ return IntUtil.toHex( a ) + IntUtil.toHex( b ) + IntUtil.toHex( c ) + IntUtil.toHex( d );
+ }
+
+ /**
+ * Auxiliary function f as defined in RFC
+ */
+ private static function f( x:int, y:int, z:int ):int {
+ return ( x & y ) | ( (~x) & z );
+ }
+
+ /**
+ * Auxiliary function g as defined in RFC
+ */
+ private static function g( x:int, y:int, z:int ):int {
+ return ( x & z ) | ( y & (~z) );
+ }
+
+ /**
+ * Auxiliary function h as defined in RFC
+ */
+ private static function h( x:int, y:int, z:int ):int {
+ return x ^ y ^ z;
+ }
+
+ /**
+ * Auxiliary function i as defined in RFC
+ */
+ private static function i( x:int, y:int, z:int ):int {
+ return y ^ ( x | (~z) );
+ }
+
+ /**
+ * A generic transformation function. The logic of ff, gg, hh, and
+ * ii are all the same, minus the function used, so pull that logic
+ * out and simplify the method bodies for the transoformation functions.
+ */
+ private static function transform( func:Function, a:int, b:int, c:int, d:int, x:int, s:int, t:int):int {
+ var tmp:int = a + int( func( b, c, d ) ) + x + t;
+ return IntUtil.rol( tmp, s ) + b;
+ }
+
+ /**
+ * ff transformation function
+ */
+ private static function ff ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+ return transform( f, a, b, c, d, x, s, t );
+ }
+
+ /**
+ * gg transformation function
+ */
+ private static function gg ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+ return transform( g, a, b, c, d, x, s, t );
+ }
+
+ /**
+ * hh transformation function
+ */
+ private static function hh ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+ return transform( h, a, b, c, d, x, s, t );
+ }
+
+ /**
+ * ii transformation function
+ */
+ private static function ii ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+ return transform( i, a, b, c, d, x, s, t );
+ }
+
+ /**
+ * Converts a string to a sequence of 16-word blocks
+ * that we'll do the processing on. Appends padding
+ * and length in the process.
+ *
+ * @param s The string to split into blocks
+ * @return An array containing the blocks that s was
+ * split into.
+ */
+ private static function createBlocks( s:String ):Array {
+ var blocks:Array = new Array();
+ var len:int = s.length * 8;
+ var mask:int = 0xFF; // ignore hi byte of characters > 0xFF
+ for( var i:int = 0; i < len; i += 8 ) {
+ blocks[ i >> 5 ] |= ( s.charCodeAt( i / 8 ) & mask ) << ( i % 32 );
+ }
+
+ // append padding and length
+ blocks[ len >> 5 ] |= 0x80 << ( len % 32 );
+ blocks[ ( ( ( len + 64 ) >>> 9 ) << 4 ) + 14 ] = len;
+ return blocks;
+ }
+
+ }
+}
View
268 src/com/adobe/crypto/SHA1.as
@@ -0,0 +1,268 @@
+/*
+Adobe Systems Incorporated(r) Source Code License Agreement
+Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+Please read this Source Code License Agreement carefully before using
+the source code.
+
+Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable copyright license, to reproduce,
+prepare derivative works of, publicly display, publicly perform, and
+distribute this source code and such derivative works in source or
+object code form without any attribution requirements.
+
+The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+derived from the source code without prior written permission.
+
+You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+against any loss, damage, claims or lawsuits, including attorney's
+fees that arise or result from your use or distribution of the source
+code.
+
+THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+ import com.adobe.utils.IntUtil;
+ import flash.utils.ByteArray;
+ import mx.utils.Base64Encoder;
+
+ /**
+ * US Secure Hash Algorithm 1 (SHA1)
+ *
+ * Implementation based on algorithm description at
+ * http://www.faqs.org/rfcs/rfc3174.html
+ */
+ public class SHA1
+ {
+ /**
+ * Performs the SHA1 hash algorithm on a string.
+ *
+ * @param s The string to hash
+ * @return A string containing the hash value of s
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ * @tiptext
+ */
+ public static function hash( s:String ):String
+ {
+ var blocks:Array = createBlocksFromString( s );
+ var byteArray:ByteArray = hashBlocks( blocks );
+
+ return IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true );
+ }
+
+ /**
+ * Performs the SHA1 hash algorithm on a ByteArray.
+ *
+ * @param data The ByteArray data to hash
+ * @return A string containing the hash value of data
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ */
+ public static function hashBytes( data:ByteArray ):String
+ {
+ var blocks:Array = SHA1.createBlocksFromByteArray( data );
+ var byteArray:ByteArray = hashBlocks(blocks);
+
+ return IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true );
+ }
+
+ /**
+ * Performs the SHA1 hash algorithm on a string, then does
+ * Base64 encoding on the result.
+ *
+ * @param s The string to hash
+ * @return The base64 encoded hash value of s
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ * @tiptext
+ */
+ public static function hashToBase64( s:String ):String
+ {
+ var blocks:Array = SHA1.createBlocksFromString( s );
+ var byteArray:ByteArray = hashBlocks(blocks);
+
+ // ByteArray.toString() returns the contents as a UTF-8 string,
+ // which we can't use because certain byte sequences might trigger
+ // a UTF-8 conversion. Instead, we convert the bytes to characters
+ // one by one.
+ var charsInByteArray:String = "";
+ byteArray.position = 0;
+ for (var j:int = 0; j < byteArray.length; j++)
+ {
+ var byte:uint = byteArray.readUnsignedByte();
+ charsInByteArray += String.fromCharCode(byte);
+ }
+
+ var encoder:Base64Encoder = new Base64Encoder();
+ encoder.encode(charsInByteArray);
+ return encoder.flush();
+ }
+
+ private static function hashBlocks( blocks:Array ):ByteArray
+ {
+ // initialize the h's
+ var h0:int = 0x67452301;
+ var h1:int = 0xefcdab89;
+ var h2:int = 0x98badcfe;
+ var h3:int = 0x10325476;
+ var h4:int = 0xc3d2e1f0;
+
+ var len:int = blocks.length;
+ var w:Array = new Array( 80 );
+
+ // loop over all of the blocks
+ for ( var i:int = 0; i < len; i += 16 ) {
+
+ // 6.1.c
+ var a:int = h0;
+ var b:int = h1;
+ var c:int = h2;
+ var d:int = h3;
+ var e:int = h4;
+
+ // 80 steps to process each block
+ // TODO: unroll for faster execution, or 4 loops of
+ // 20 each to avoid the k and f function calls
+ for ( var t:int = 0; t < 80; t++ ) {
+
+ if ( t < 16 ) {
+ // 6.1.a
+ w[ t ] = blocks[ i + t ];
+ } else {
+ // 6.1.b
+ w[ t ] = IntUtil.rol( w[ t - 3 ] ^ w[ t - 8 ] ^ w[ t - 14 ] ^ w[ t - 16 ], 1 );
+ }
+
+ // 6.1.d
+ var temp:int = IntUtil.rol( a, 5 ) + f( t, b, c, d ) + e + int( w[ t ] ) + k( t );
+
+ e = d;
+ d = c;
+ c = IntUtil.rol( b, 30 );
+ b = a;
+ a = temp;
+ }
+
+ // 6.1.e
+ h0 += a;
+ h1 += b;
+ h2 += c;
+ h3 += d;
+ h4 += e;
+ }
+
+ var byteArray:ByteArray = new ByteArray();
+ byteArray.writeInt(h0);
+ byteArray.writeInt(h1);
+ byteArray.writeInt(h2);
+ byteArray.writeInt(h3);
+ byteArray.writeInt(h4);
+ byteArray.position = 0;
+ return byteArray;
+ }
+
+ /**
+ * Performs the logical function based on t
+ */
+ private static function f( t:int, b:int, c:int, d:int ):int {
+ if ( t < 20 ) {
+ return ( b & c ) | ( ~b & d );
+ } else if ( t < 40 ) {
+ return b ^ c ^ d;
+ } else if ( t < 60 ) {
+ return ( b & c ) | ( b & d ) | ( c & d );
+ }
+ return b ^ c ^ d;
+ }
+
+ /**
+ * Determines the constant value based on t
+ */
+ private static function k( t:int ):int {
+ if ( t < 20 ) {
+ return 0x5a827999;
+ } else if ( t < 40 ) {
+ return 0x6ed9eba1;
+ } else if ( t < 60 ) {
+ return 0x8f1bbcdc;
+ }
+ return 0xca62c1d6;
+ }
+
+ /**
+ * Converts a ByteArray to a sequence of 16-word blocks
+ * that we'll do the processing on. Appends padding
+ * and length in the process.
+ *
+ * @param data The data to split into blocks
+ * @return An array containing the blocks into which data was split
+ */
+ private static function createBlocksFromByteArray( data:ByteArray ):Array
+ {
+ var oldPosition:int = data.position;
+ data.position = 0;
+
+ var blocks:Array = new Array();
+ var len:int = data.length * 8;
+ var mask:int = 0xFF; // ignore hi byte of characters > 0xFF
+ for( var i:int = 0; i < len; i += 8 )
+ {
+ blocks[ i >> 5 ] |= ( data.readByte() & mask ) << ( 24 - i % 32 );
+ }
+
+ // append padding and length
+ blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+ blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+
+ data.position = oldPosition;
+
+ return blocks;
+ }
+
+ /**
+ * Converts a string to a sequence of 16-word blocks
+ * that we'll do the processing on. Appends padding
+ * and length in the process.
+ *
+ * @param s The string to split into blocks
+ * @return An array containing the blocks that s was split into.
+ */
+ private static function createBlocksFromString( s:String ):Array
+ {
+ var blocks:Array = new Array();
+ var len:int = s.length * 8;
+ var mask:int = 0xFF; // ignore hi byte of characters > 0xFF
+ for( var i:int = 0; i < len; i += 8 ) {
+ blocks[ i >> 5 ] |= ( s.charCodeAt( i / 8 ) & mask ) << ( 24 - i % 32 );
+ }
+
+ // append padding and length
+ blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+ blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+ return blocks;
+ }
+
+ }
+}
View
255 src/com/adobe/crypto/SHA224.as
@@ -0,0 +1,255 @@
+/*
+Adobe Systems Incorporated(r) Source Code License Agreement
+Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+Please read this Source Code License Agreement carefully before using
+the source code.
+
+Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable copyright license, to reproduce,
+prepare derivative works of, publicly display, publicly perform, and
+distribute this source code and such derivative works in source or
+object code form without any attribution requirements.
+
+The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+derived from the source code without prior written permission.
+
+You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+against any loss, damage, claims or lawsuits, including attorney's
+fees that arise or result from your use or distribution of the source
+code.
+
+THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+ import com.adobe.utils.IntUtil;
+ import flash.utils.ByteArray;
+ import mx.utils.Base64Encoder;
+
+ /**
+ * The SHA-224 algorithm
+ *
+ * @see http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf
+ */
+ public class SHA224
+ {
+
+ /**
+ * Performs the SHA224 hash algorithm on a string.
+ *
+ * @param s The string to hash
+ * @return A string containing the hash value of s
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ * @tiptext
+ */
+ public static function hash( s:String ):String {
+ var blocks:Array = createBlocksFromString( s );
+ var byteArray:ByteArray = hashBlocks( blocks );
+ return IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true );
+ }
+
+ /**
+ * Performs the SHA224 hash algorithm on a ByteArray.
+ *
+ * @param data The ByteArray data to hash
+ * @return A string containing the hash value of data
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ */
+ public static function hashBytes( data:ByteArray ):String
+ {
+ var blocks:Array = createBlocksFromByteArray( data );
+ var byteArray:ByteArray = hashBlocks(blocks);
+ return IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true );
+ }
+
+ /**
+ * Performs the SHA224 hash algorithm on a string, then does
+ * Base64 encoding on the result.
+ *
+ * @param s The string to hash
+ * @return The base64 encoded hash value of s
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ * @tiptext
+ */
+ public static function hashToBase64( s:String ):String
+ {
+ var blocks:Array = createBlocksFromString( s );
+ var byteArray:ByteArray = hashBlocks(blocks);
+
+ // ByteArray.toString() returns the contents as a UTF-8 string,
+ // which we can't use because certain byte sequences might trigger
+ // a UTF-8 conversion. Instead, we convert the bytes to characters
+ // one by one.
+ var charsInByteArray:String = "";
+ byteArray.position = 0;
+ for (var j:int = 0; j < byteArray.length; j++)
+ {
+ var byte:uint = byteArray.readUnsignedByte();
+ charsInByteArray += String.fromCharCode(byte);
+ }
+
+ var encoder:Base64Encoder = new Base64Encoder();
+ encoder.encode(charsInByteArray);
+ return encoder.flush();
+ }
+
+ private static function hashBlocks( blocks:Array ):ByteArray {
+ var h0:int = 0xc1059ed8;
+ var h1:int = 0x367cd507;
+ var h2:int = 0x3070dd17;
+ var h3:int = 0xf70e5939;
+ var h4:int = 0xffc00b31;
+ var h5:int = 0x68581511;
+ var h6:int = 0x64f98fa7;
+ var h7:int = 0xbefa4fa4;
+
+ var k:Array = new Array(0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2);
+
+ var len:int = blocks.length;
+ var w:Array = new Array();
+
+ // loop over all of the blocks
+ for ( var i:int = 0; i < len; i += 16 ) {
+
+ var a:int = h0;
+ var b:int = h1;
+ var c:int = h2;
+ var d:int = h3;
+ var e:int = h4;
+ var f:int = h5;
+ var g:int = h6;
+ var h:int = h7;
+
+ for(var t:int = 0; t < 64; t++) {
+
+ if ( t < 16 ) {
+ w[t] = blocks[ i + t ];
+ if(isNaN(w[t])) { w[t] = 0; }
+ } else {
+ var ws0:int = IntUtil.ror(w[t-15], 7) ^ IntUtil.ror(w[t-15], 18) ^ (w[t-15] >>> 3);
+ var ws1:int = IntUtil.ror(w[t-2], 17) ^ IntUtil.ror(w[t-2], 19) ^ (w[t-2] >>> 10);
+ w[t] = w[t-16] + ws0 + w[t-7] + ws1;
+ }
+
+ var s0:int = IntUtil.ror(a, 2) ^ IntUtil.ror(a, 13) ^ IntUtil.ror(a, 22);
+ var maj:int = (a & b) ^ (a & c) ^ (b & c);
+ var t2:int = s0 + maj;
+ var s1:int = IntUtil.ror(e, 6) ^ IntUtil.ror(e, 11) ^ IntUtil.ror(e, 25);
+ var ch:int = (e & f) ^ ((~e) & g);
+ var t1:int = h + s1 + ch + k[t] + w[t];
+
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+
+ //Add this chunk's hash to result so far:
+ h0 += a;
+ h1 += b;
+ h2 += c;
+ h3 += d;
+ h4 += e;
+ h5 += f;
+ h6 += g;
+ h7 += h;
+ }
+
+ var byteArray:ByteArray = new ByteArray();
+ byteArray.writeInt(h0);
+ byteArray.writeInt(h1);
+ byteArray.writeInt(h2);
+ byteArray.writeInt(h3);
+ byteArray.writeInt(h4);
+ byteArray.writeInt(h5);
+ byteArray.writeInt(h6);
+ byteArray.position = 0;
+ return byteArray;
+ }
+
+ /**
+ * Converts a ByteArray to a sequence of 16-word blocks
+ * that we'll do the processing on. Appends padding
+ * and length in the process.
+ *
+ * @param data The data to split into blocks
+ * @return An array containing the blocks into which data was split
+ */
+ private static function createBlocksFromByteArray( data:ByteArray ):Array
+ {
+ var oldPosition:int = data.position;
+ data.position = 0;
+
+ var blocks:Array = new Array();
+ var len:int = data.length * 8;
+ var mask:int = 0xFF; // ignore hi byte of characters > 0xFF
+ for( var i:int = 0; i < len; i += 8 )
+ {
+ blocks[ i >> 5 ] |= ( data.readByte() & mask ) << ( 24 - i % 32 );
+ }
+
+ // append padding and length
+ blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+ blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+
+ data.position = oldPosition;
+
+ return blocks;
+ }
+
+ /**
+ * Converts a string to a sequence of 16-word blocks
+ * that we'll do the processing on. Appends padding
+ * and length in the process.
+ *
+ * @param s The string to split into blocks
+ * @return An array containing the blocks that s was split into.
+ */
+ private static function createBlocksFromString( s:String ):Array
+ {
+ var blocks:Array = new Array();
+ var len:int = s.length * 8;
+ var mask:int = 0xFF; // ignore hi byte of characters > 0xFF
+ for( var i:int = 0; i < len; i += 8 ) {
+ blocks[ i >> 5 ] |= ( s.charCodeAt( i / 8 ) & mask ) << ( 24 - i % 32 );
+ }
+
+ // append padding and length
+ blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+ blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+ return blocks;
+ }
+ }
+}
View
260 src/com/adobe/crypto/SHA256.as
@@ -0,0 +1,260 @@
+/*
+Adobe Systems Incorporated(r) Source Code License Agreement
+Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+Please read this Source Code License Agreement carefully before using
+the source code.
+
+Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable copyright license, to reproduce,
+prepare derivative works of, publicly display, publicly perform, and
+distribute this source code and such derivative works in source or
+object code form without any attribution requirements.
+
+The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+derived from the source code without prior written permission.
+
+You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+against any loss, damage, claims or lawsuits, including attorney's
+fees that arise or result from your use or distribution of the source
+code.
+
+THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+ import com.adobe.utils.IntUtil;
+ import flash.utils.ByteArray;
+ import mx.utils.Base64Encoder;
+
+ /**
+ * The SHA-256 algorithm
+ *
+ * @see http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf
+ */
+ public class SHA256
+ {
+
+ /**
+ * Performs the SHA256 hash algorithm on a string.
+ *
+ * @param s The string to hash
+ * @return A string containing the hash value of s
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ * @tiptext
+ */
+ public static function hash( s:String ):String {
+ var blocks:Array = createBlocksFromString( s );
+ var byteArray:ByteArray = hashBlocks( blocks );
+
+ return IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true );
+ }
+
+ /**
+ * Performs the SHA256 hash algorithm on a ByteArray.
+ *
+ * @param data The ByteArray data to hash
+ * @return A string containing the hash value of data
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ */
+ public static function hashBytes( data:ByteArray ):String
+ {
+ var blocks:Array = createBlocksFromByteArray( data );
+ var byteArray:ByteArray = hashBlocks(blocks);
+
+ return IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true )
+ + IntUtil.toHex( byteArray.readInt(), true );
+ }
+
+ /**
+ * Performs the SHA256 hash algorithm on a string, then does
+ * Base64 encoding on the result.
+ *
+ * @param s The string to hash
+ * @return The base64 encoded hash value of s
+ * @langversion ActionScript 3.0
+ * @playerversion 9.0
+ * @tiptext
+ */
+ public static function hashToBase64( s:String ):String
+ {
+ var blocks:Array = createBlocksFromString( s );
+ var byteArray:ByteArray = hashBlocks(blocks);
+
+ // ByteArray.toString() returns the contents as a UTF-8 string,
+ // which we can't use because certain byte sequences might trigger
+ // a UTF-8 conversion. Instead, we convert the bytes to characters
+ // one by one.
+ var charsInByteArray:String = "";
+ byteArray.position = 0;
+ for (var j:int = 0; j < byteArray.length; j++)
+ {
+ var byte:uint = byteArray.readUnsignedByte();
+ charsInByteArray += String.fromCharCode(byte);
+ }
+
+ var encoder:Base64Encoder = new Base64Encoder();
+ encoder.encode(charsInByteArray);
+ return encoder.flush();
+ }
+
+ private static function hashBlocks( blocks:Array ):ByteArray {
+ var h0:int = 0x6a09e667;
+ var h1:int = 0xbb67ae85;
+ var h2:int = 0x3c6ef372;
+ var h3:int = 0xa54ff53a;
+ var h4:int = 0x510e527f;
+ var h5:int = 0x9b05688c;
+ var h6:int = 0x1f83d9ab;
+ var h7:int = 0x5be0cd19;
+
+ var k:Array = new Array(0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2);
+
+ var len:int = blocks.length;
+ var w:Array = new Array( 64 );
+
+ // loop over all of the blocks
+ for ( var i:int = 0; i < len; i += 16 ) {
+
+ var a:int = h0;
+ var b:int = h1;
+ var c:int = h2;
+ var d:int = h3;
+ var e:int = h4;
+ var f:int = h5;
+ var g:int = h6;
+ var h:int = h7;
+
+ for(var t:int = 0; t < 64; t++) {
+
+ if ( t < 16 ) {
+ w[t] = blocks[ i + t ];
+ if(isNaN(w[t])) { w[t] = 0; }
+ } else {
+ var ws0:int = IntUtil.ror(w[t-15], 7) ^ IntUtil.ror(w[t-15], 18) ^ (w[t-15] >>> 3);
+ var ws1:int = IntUtil.ror(w[t-2], 17) ^ IntUtil.ror(w[t-2], 19) ^ (w[t-2] >>> 10);
+ w[t] = w[t-16] + ws0 + w[t-7] + ws1;
+ }
+
+ var s0:int = IntUtil.ror(a, 2) ^ IntUtil.ror(a, 13) ^ IntUtil.ror(a, 22);
+ var maj:int = (a & b) ^ (a & c) ^ (b & c);
+ var t2:int = s0 + maj;
+ var s1:int = IntUtil.ror(e, 6) ^ IntUtil.ror(e, 11) ^ IntUtil.ror(e, 25);
+ var ch:int = (e & f) ^ ((~e) & g);
+ var t1:int = h + s1 + ch + k[t] + w[t];
+
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+
+ //Add this chunk's hash to result so far:
+ h0 += a;
+ h1 += b;
+ h2 += c;
+ h3 += d;
+ h4 += e;
+ h5 += f;
+ h6 += g;
+ h7 += h;
+ }
+
+ var byteArray:ByteArray = new ByteArray();
+ byteArray.writeInt(h0);
+ byteArray.writeInt(h1);
+ byteArray.writeInt(h2);
+ byteArray.writeInt(h3);
+ byteArray.writeInt(h4);
+ byteArray.writeInt(h5);
+ byteArray.writeInt(h6);
+ byteArray.writeInt(h7);
+ byteArray.position = 0;
+ return byteArray;
+ }
+
+ /**
+ * Converts a ByteArray to a sequence of 16-word blocks
+ * that we'll do the processing on. Appends padding
+ * and length in the process.
+ *
+ * @param data The data to split into blocks
+ * @return An array containing the blocks into which data was split
+ */
+ private static function createBlocksFromByteArray( data:ByteArray ):Array
+ {
+ var oldPosition:int = data.position;
+ data.position = 0;
+
+ var blocks:Array = new Array();
+ var len:int = data.length * 8;
+ var mask:int = 0xFF; // ignore hi byte of characters > 0xFF
+ for( var i:int = 0; i < len; i += 8 )
+ {
+ blocks[ i >> 5 ] |= ( data.readByte() & mask ) << ( 24 - i % 32 );
+ }
+
+ // append padding and length
+ blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+ blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+
+ data.position = oldPosition;
+
+ return blocks;
+ }
+
+ /**
+ * Converts a string to a sequence of 16-word blocks
+ * that we'll do the processing on. Appends padding
+ * and length in the process.
+ *
+ * @param s The string to split into blocks
+ * @return An array containing the blocks that s was split into.
+ */
+ private static function createBlocksFromString( s:String ):Array
+ {
+ var blocks:Array = new Array();
+ var len:int = s.length * 8;
+ var mask:int = 0xFF; // ignore hi byte of characters > 0xFF
+ for( var i:int = 0; i < len; i += 8 ) {
+ blocks[ i >> 5 ] |= ( s.charCodeAt( i / 8 ) & mask ) << ( 24 - i % 32 );
+ }
+
+ // append padding and length
+ blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+ blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+ return blocks;
+ }
+ }
+}
View
117 src/com/adobe/crypto/WSSEUsernameToken.as
@@ -0,0 +1,117 @@
+/*
+Adobe Systems Incorporated(r) Source Code License Agreement
+Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+Please read this Source Code License Agreement carefully before using
+the source code.
+
+Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable copyright license, to reproduce,
+prepare derivative works of, publicly display, publicly perform, and
+distribute this source code and such derivative works in source or
+object code form without any attribution requirements.
+
+The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+derived from the source code without prior written permission.
+
+You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+against any loss, damage, claims or lawsuits, including attorney's
+fees that arise or result from your use or distribution of the source
+code.
+
+THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+ import mx.formatters.DateFormatter;
+ import mx.utils.Base64Encoder;
+
+ /**
+ * Web Services Security Username Token
+ *
+ * Implementation based on algorithm description at
+ * http://www.oasis-open.org/committees/wss/documents/WSS-Username-02-0223-merged.pdf
+ */
+ public class WSSEUsernameToken
+ {
+ /**
+ * Generates a WSSE Username Token.
+ *
+ * @param username The username
+ * @param password The password
+ * @param nonce A cryptographically random nonce (if null, the nonce
+ * will be generated)
+ * @param timestamp The time at which the token is generated (if null,
+ * the time will be set to the moment of execution)
+ * @return The generated token
+ * @langversion ActionScript 3.0
+ * @playerversion Flash 9.0
+ * @tiptext
+ */
+ public static function getUsernameToken(username:String, password:String, nonce:String=null, timestamp:Date=null):String
+ {
+ if (nonce == null)
+ {
+ nonce = generateNonce();
+ }
+ nonce = base64Encode(nonce);
+
+ var created:String = generateTimestamp(timestamp);
+
+ var password64:String = getBase64Digest(nonce,
+ created,
+ password);
+
+ var token:String = new String("UsernameToken Username=\"");
+ token += username + "\", " +
+ "PasswordDigest=\"" + password64 + "\", " +
+ "Nonce=\"" + nonce + "\", " +
+ "Created=\"" + created + "\"";
+ return token;
+ }
+
+ private static function generateNonce():String
+ {
+ // Math.random returns a Number between 0 and 1. We don't want our
+ // nonce to contain invalid characters (e.g. the period) so we
+ // strip them out before returning the result.
+ var s:String = Math.random().toString();
+ return s.replace(".", "");
+ }
+
+ internal static function base64Encode(s:String):String
+ {
+ var encoder:Base64Encoder = new Base64Encoder();
+ encoder.encode(s);
+ return encoder.flush();
+ }
+
+ internal static function generateTimestamp(timestamp:Date):String
+ {
+ if (timestamp == null)
+ {
+ timestamp = new Date();
+ }
+ var dateFormatter:DateFormatter = new DateFormatter();
+ dateFormatter.formatString = "YYYY-MM-DDTJJ:NN:SS"
+ return dateFormatter.format(timestamp) + "Z";
+ }
+
+ internal static function getBase64Digest(nonce:String, created:String, password:String):String
+ {
+ return SHA1.hashToBase64(nonce + created + password);
+ }
+ }
+}
View
66 src/com/adobe/errors/IllegalStateError.as
@@ -0,0 +1,66 @@
+/*
+ Adobe Systems Incorporated(r) Source Code License Agreement
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+ Please read this Source Code License Agreement carefully before using
+ the source code.
+
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
+ prepare derivative works of, publicly display, publicly perform, and
+ distribute this source code and such derivative works in source or
+ object code form without any attribution requirements.
+
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+ derived from the source code without prior written permission.
+
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+ against any loss, damage, claims or lawsuits, including attorney's
+ fees that arise or result from your use or distribution of the source
+ code.
+
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.errors
+{
+ /**
+ * This class represents an Error that is thrown when a method is called when
+ * the receiving instance is in an invalid state.
+ *
+ * For example, this may occur if a method has been called, and other properties
+ * in the instance have not been initialized properly.
+ *
+ * @langversion ActionScript 3.0
+ * @playerversion Flash 9.0
+ * @tiptext
+ *
+ */
+ public class IllegalStateError extends Error
+ {
+ /**
+ * Constructor
+ *
+ * @param message A message describing the error in detail.
+ *
+ * @langversion ActionScript 3.0
+ * @playerversion Flash 9.0
+ * @tiptext
+ */
+ public function IllegalStateError(message:String)
+ {
+ super(message);
+ }
+ }
+}
View
50 src/com/adobe/fileformats/vcard/Address.as
@@ -0,0 +1,50 @@
+/*
+ Adobe Systems Incorporated(r) Source Code License Agreement
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+ Please read this Source Code License Agreement carefully before using
+ the source code.
+
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
+ prepare derivative works of, publicly display, publicly perform, and
+ distribute this source code and such derivative works in source or
+ object code form without any attribution requirements.
+
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+ derived from the source code without prior written permission.
+
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+ against any loss, damage, claims or lawsuits, including attorney's
+ fees that arise or result from your use or distribution of the source
+ code.
+
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+ public class Address
+ {
+ public var type:String;
+ public var street:String;
+ public var city:String;
+ public var state:String;
+ public var postalCode:String;
+
+ public function toString():String
+ {
+ return (street + " " + city + ", " + state + " " + postalCode);
+ }
+ }
+}
View
42 src/com/adobe/fileformats/vcard/Email.as
@@ -0,0 +1,42 @@
+/*
+ Adobe Systems Incorporated(r) Source Code License Agreement
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+ Please read this Source Code License Agreement carefully before using
+ the source code.
+
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
+ prepare derivative works of, publicly display, publicly perform, and
+ distribute this source code and such derivative works in source or
+ object code form without any attribution requirements.
+
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+ derived from the source code without prior written permission.
+
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+ against any loss, damage, claims or lawsuits, including attorney's
+ fees that arise or result from your use or distribution of the source
+ code.
+
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+ public class Email
+ {
+ public var type:String;
+ public var address:String;
+ }
+}
View
42 src/com/adobe/fileformats/vcard/Phone.as
@@ -0,0 +1,42 @@
+/*
+ Adobe Systems Incorporated(r) Source Code License Agreement
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+ Please read this Source Code License Agreement carefully before using
+ the source code.
+
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
+ prepare derivative works of, publicly display, publicly perform, and
+ distribute this source code and such derivative works in source or
+ object code form without any attribution requirements.
+
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+ derived from the source code without prior written permission.
+
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+ against any loss, damage, claims or lawsuits, including attorney's
+ fees that arise or result from your use or distribution of the source
+ code.
+
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+ public class Phone
+ {
+ public var type:String;
+ public var number:String;
+ }
+}
View
57 src/com/adobe/fileformats/vcard/VCard.as
@@ -0,0 +1,57 @@
+/*
+ Adobe Systems Incorporated(r) Source Code License Agreement
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+ Please read this Source Code License Agreement carefully before using
+ the source code.
+
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
+ prepare derivative works of, publicly display, publicly perform, and
+ distribute this source code and such derivative works in source or
+ object code form without any attribution requirements.
+
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+ derived from the source code without prior written permission.
+
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+ against any loss, damage, claims or lawsuits, including attorney's
+ fees that arise or result from your use or distribution of the source
+ code.
+
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+ import flash.utils.ByteArray;
+
+ public class VCard
+ {
+ public var fullName:String;
+ public var orgs:Array;
+ public var title:String;
+ public var image:ByteArray;
+ public var phones:Array;
+ public var emails:Array;
+ public var addresses:Array;
+
+ public function VCard()
+ {
+ orgs = new Array();
+ phones = new Array();
+ emails = new Array();
+ addresses = new Array();
+ }
+ }
+}
View
249 src/com/adobe/fileformats/vcard/VCardParser.as
@@ -0,0 +1,249 @@
+/*
+ Adobe Systems Incorporated(r) Source Code License Agreement
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+ Please read this Source Code License Agreement carefully before using
+ the source code.
+
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
+ prepare derivative works of, publicly display, publicly perform, and
+ distribute this source code and such derivative works in source or
+ object code form without any attribution requirements.
+
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+ derived from the source code without prior written permission.
+
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+ against any loss, damage, claims or lawsuits, including attorney's
+ fees that arise or result from your use or distribution of the source
+ code.
+
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+ import mx.utils.Base64Decoder;
+ import mx.utils.StringUtil;
+
+ public class VCardParser
+ {
+ public static function parse(vcardStr:String):Array
+ {
+ var vcards:Array = new Array();
+ var lines:Array = vcardStr.split(/\r\n/);
+ var vcard:VCard;
+ var type:String;
+ var typeTmp:String;
+ var line:String;
+
+ for (var i:uint = 0; i < lines.length; ++i)
+ {
+ line = lines[i];
+ if (line == "BEGIN:VCARD")
+ {
+ vcard = new VCard();
+ }
+ else if (line == "END:VCARD")
+ {
+ if (vcard != null)
+ {
+ vcards.push(vcard);
+ }
+ }
+ else if(line.search(/^ORG/i) != -1)
+ {
+ var org:String = line.substring(4, line.length);
+ var orgArray:Array = org.split(";");
+ for each (var orgToken:String in orgArray)
+ {
+ if (StringUtil.trim(orgToken).length > 0)
+ {
+ vcard.orgs.push(orgToken);
+ }
+ }
+ }
+ else if(line.search(/^TITLE/i) != -1)
+ {
+ var title:String = line.substring(6, line.length);
+ vcard.title = title;
+ }
+ else if (line.search(/^FN:/i) != -1)
+ {
+ var fullName:String = line.substring(3, line.length);
+ vcard.fullName = fullName;
+ }
+ else if (line.search(/^TEL/i) != -1)
+ {
+ type = new String();
+ typeTmp = new String();
+ var phone:Phone = new Phone();
+ var number:String;
+ var phoneTokens:Array = line.split(";");
+ for each (var phoneToken:String in phoneTokens)
+ {
+ if (phoneToken.search(/^TYPE=/i) != -1)
+ {
+ if (phoneToken.indexOf(":") != -1)
+ {
+ typeTmp = phoneToken.substring(5, phoneToken.indexOf(":"));
+ number = phoneToken.substring(phoneToken.indexOf(":")+1, phoneToken.length);
+ }
+ else
+ {
+ typeTmp = phoneToken.substring(5, phoneToken.length);
+ }
+
+ typeTmp = typeTmp.toLocaleLowerCase();
+
+ if (typeTmp == "pref")
+ {
+ continue;
+ }
+ if (type.length != 0)
+ {
+ type += (" ");
+ }
+ type += typeTmp;
+ }
+ }
+ if (type.length > 0 && number != null)
+ {
+ phone.type = type;
+ phone.number = number;
+ }
+ vcard.phones.push(phone);
+ }
+ else if (line.search(/^EMAIL/i) != -1)
+ {
+ type = new String();
+ typeTmp = new String();
+ var email:Email = new Email();
+ var emailAddress:String;
+ var emailTokens:Array = line.split(";");
+ for each (var emailToken:String in emailTokens)
+ {
+ if (emailToken.search(/^TYPE=/i) != -1)
+ {
+ if (emailToken.indexOf(":") != -1)
+ {
+ typeTmp = emailToken.substring(5, emailToken.indexOf(":"));
+ emailAddress = emailToken.substring(emailToken.indexOf(":")+1, emailToken.length);
+ }
+ else
+ {
+ typeTmp = emailToken.substring(5, emailToken.length);
+ }
+
+ typeTmp = typeTmp.toLocaleLowerCase();
+
+ if (typeTmp == "pref" || typeTmp == "internet")
+ {
+ continue;
+ }
+ if (type.length != 0)
+ {
+ type += (" ");
+ }
+ type += typeTmp;
+ }
+ }
+ if (type.length > 0 && emailAddress != null)
+ {
+ email.type = type;
+ email.address = emailAddress;
+ }
+ vcard.emails.push(email);
+ }
+ else if (line.indexOf("ADR;") != -1)
+ {
+ var addressTokens:Array = line.split(";");
+ var address:Address = new Address();
+ for (var j:uint = 0; j < addressTokens.length; ++j)
+ {
+ var addressToken:String = addressTokens[j];
+ if (addressToken.search(/^home:+$/i) != -1) // For Outlook, which uses non-standard vCards.
+ {
+ address.type = "home";
+ }
+ else if (addressToken.search(/^work:+$/i) != -1) // For Outlook, which uses non-standard vCards.
+ {
+ address.type = "work";
+ }
+ if (addressToken.search(/^type=/i) != -1) // The "type" parameter is the standard way (which Address Book uses)
+ {
+ // First, remove the optional ":" character.
+ addressToken = addressToken.replace(/:/,"");
+ var addressType:String = addressToken.substring(5, addressToken.length).toLowerCase();
+ if (addressType == "pref") // Not interested in which one is preferred.
+ {
+ continue;
+ }
+ else if (addressType.indexOf("home") != -1) // home
+ {
+ addressType = "home";
+ }
+ else if (addressType.indexOf("work") != -1) // work
+ {
+ addressType = "work";
+ }
+ else if (addressType.indexOf(",") != -1) // if the comma technique is used, just use the first one
+ {
+ var typeTokens:Array = addressType.split(",");
+ for each (var typeToken:String in typeTokens)
+ {
+ if (typeToken != "pref")
+ {
+ addressType = typeToken;
+ break;
+ }
+ }
+ }
+ address.type = addressType;
+ }
+ else if (addressToken.search(/^\d/) != -1 && address.street == null)
+ {
+ address.street = addressToken.replace(/\\n/, "");
+ address.city = addressTokens[j+1];
+ address.state = addressTokens[j+2];
+ address.postalCode = addressTokens[j+3];
+ }
+ }
+ if (address.type != null && address.street != null)
+ {
+ vcard.addresses.push(address);
+ }
+
+ }
+ else if (line.search(/^PHOTO;BASE64/i) != -1)
+ {
+ var imageStr:String = new String();
+ for (var k:uint = i+1; k < lines.length; ++k)
+ {
+ imageStr += lines[k];
+ //if (lines[k].search(/.+\=$/) != -1) // Very slow in Mac due to RegEx bug
+ if (lines[k].indexOf('=') != -1)
+ {
+ var decoder:Base64Decoder = new Base64Decoder();
+ decoder.decode(imageStr);
+ vcard.image = decoder.flush();
+ break;
+ }
+ }
+ }
+ }
+ return vcards;
+ }
+ }
+}
View
42 src/com/adobe/images/BitString.as
@@ -0,0 +1,42 @@
+/*
+ Adobe Systems Incorporated(r) Source Code License Agreement
+ Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
+
+ Please read this Source Code License Agreement carefully before using
+ the source code.
+
+ Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
+ no-charge, royalty-free, irrevocable copyright license, to reproduce,
+ prepare derivative works of, publicly display, publicly perform, and
+ distribute this source code and such derivative works in source or
+ object code form without any attribution requirements.
+
+ The name "Adobe Systems Incorporated" must not be used to endorse or promote products
+ derived from the source code without prior written permission.
+
+ You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
+ against any loss, damage, claims or lawsuits, including attorney's
+ fees that arise or result from your use or distribution of the source
+ code.
+
+ THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
+ ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
+ NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
+ OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.images
+{
+ public class BitString
+ {
+ public var len:int = 0;
+ public var val:int = 0;
+ }
+}
View
651