From 84731e8f008612d78ec62bc77762d01f63970ec4 Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 15 May 2011 14:05:02 -0700 Subject: [PATCH] Aphlict, simple notification server Summary: This is purely a prototype at the moment, but the basic functionality sort of works. I'm not sure how far I want to go with this but I think we might be able to get somewhere without it being gross. The idea here is to build a notification server WITHOUT using Comet, since Comet is extremely difficult and complicated. Instead, I use Flash on the client. LocalConnection allows flash instances to talk to each other and connect() can be used as a locking primitive. This allows all the instances to elect a master instance in a race-safe way. The master is responsible for opening a single connnection to the server. On the server, I use Node.js since PHP is pretty unsuitable for this task. See Github Issue #3: https://github.com/facebook/phabricator/issues/3 One thing I need to figure out next is if I can reasonably do SSL/TSL over Flash (it looks like I can, in theory, with the as3crypto library) or if the server needs to just send down version information and trigger a separate Ajax call on the client. Test Plan: Created a client pool and connected it to the server, with election and failover apparently working correctly. Reviewed By: aran Reviewers: Girish, aran, jungejason, tuomaspelkonen, davidrecordon Commenters: Girish, davidrecordon CC: aran, epriestley, Girish, davidrecordon Differential Revision: 284 --- externals/vegas/LICENSE | 581 ++++++++++++++ externals/vegas/README | 29 + externals/vegas/src/system/Serializer.as | 86 ++ externals/vegas/src/vegas/strings/JSON.as | 107 +++ .../vegas/src/vegas/strings/json/JSONError.as | 84 ++ .../src/vegas/strings/json/JSONSerializer.as | 757 ++++++++++++++++++ .../src/vegas/strings/json/JSONStrings.as | 85 ++ .../lint/engine/PhabricatorLintEngine.php | 5 + .../aphlict/client/build_aphlict_client.sh | 27 + support/aphlict/client/src/Aphlict.as | 162 ++++ .../src/com/phabricator/AphlictReceiver.as | 25 + support/aphlict/server/aphlict_server.js | 42 + webroot/rsrc/swf/aphlict.swf | Bin 0 -> 8031 bytes webroot/rsrc/swf/test.html | 4 + 14 files changed, 1994 insertions(+) create mode 100644 externals/vegas/LICENSE create mode 100644 externals/vegas/README create mode 100644 externals/vegas/src/system/Serializer.as create mode 100644 externals/vegas/src/vegas/strings/JSON.as create mode 100644 externals/vegas/src/vegas/strings/json/JSONError.as create mode 100644 externals/vegas/src/vegas/strings/json/JSONSerializer.as create mode 100644 externals/vegas/src/vegas/strings/json/JSONStrings.as create mode 100755 support/aphlict/client/build_aphlict_client.sh create mode 100644 support/aphlict/client/src/Aphlict.as create mode 100644 support/aphlict/client/src/com/phabricator/AphlictReceiver.as create mode 100755 support/aphlict/server/aphlict_server.js create mode 100644 webroot/rsrc/swf/aphlict.swf create mode 100755 webroot/rsrc/swf/test.html diff --git a/externals/vegas/LICENSE b/externals/vegas/LICENSE new file mode 100644 index 0000000000..0c5ecafa21 --- /dev/null +++ b/externals/vegas/LICENSE @@ -0,0 +1,581 @@ +Mozilla Public License 1.1 (MPL 1.1) + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or + otherwise making the Covered Code available to a third + party. + + 1.1. ''Contributor'' means each entity that creates or + contributes to the creation of Modifications. + + 1.2. ''Contributor Version'' means the combination of + the Original Code, prior Modifications used by + a Contributor, and the Modifications made by that + particular Contributor. + + 1.3. ''Covered Code'' means the Original Code or + Modifications or the combination of the Original Code + and Modifications, in each case including portions + thereof. + + 1.4. ''Electronic Distribution Mechanism'' means a + mechanism generally accepted in the software + development community for the electronic transfer of + data. + + 1.5. ''Executable'' means Covered Code in any form + other than Source Code. + + 1.6. ''Initial Developer'' means the individual or + entity identified as the Initial Developer in the + Source Code notice required by Exhibit A. + + 1.7. ''Larger Work'' means a work which combines + Covered Code or portions thereof with code not + governed by the terms of this License. + + 1.8. ''License'' means this document. + + 1.8.1. "Licensable" means having the right to grant, + to the maximum extent possible, whether at the time of + the initial grant or subsequently acquired, any and + all of the rights conveyed herein. + + 1.9. ''Modifications'' means any addition to or + deletion from the substance or structure of either the + Original Code or any previous Modifications. When + Covered Code is released as a series of files, a + Modification is: + + A. Any addition to or deletion from the contents + of a file containing Original Code or previous + Modifications. + + B. Any new file that contains any part of the + Original Code or previous Modifications. + + 1.10. ''Original Code'' means Source Code of computer + software code which is described in the Source Code + notice required by Exhibit A as Original Code, and + which, at the time of its release under this License + is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now + owned or hereafter acquired, including without + limitation, method, process, and apparatus claims, in + any patent Licensable by grantor. + + 1.11. ''Source Code'' means the preferred form of the + Covered Code for making modifications to it, including + all modules it contains, plus any associated interface + definition files, scripts used to control compilation + and installation of an Executable, or source code + differential comparisons against either the Original + Code or another well known, available Covered Code of + the Contributor's choice. The Source Code can be in a + compressed or archival form, provided the appropriate + decompression or de-archiving software is widely + available for no charge. + + 1.12. "You'' (or "Your") means an individual or a + legal entity exercising rights under, and complying + with all of the terms of, this License or a future + version of this License issued under Section 6.1. For + legal entities, "You'' includes any entity which + controls, is controlled by, or is under common control + with You. For purposes of this definition, "control'' + means (a) the power, direct or indirect, to cause the + direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or + beneficial ownership of such entity. + + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, + royalty-free, non-exclusive license, subject to third + party intellectual property claims: + (a) under intellectual property rights (other + than patent or trademark) Licensable by Initial + Developer to use, reproduce, modify, display, + perform, sublicense and distribute the Original + Code (or portions thereof) with or without + Modifications, and/or as part of a Larger Work; + and + + (b) under Patents Claims infringed by the making, + using or selling of Original Code, to make, have + made, use, practice, sell, and offer for sale, + and/or otherwise dispose of the Original Code (or + portions thereof). + + (c) the licenses granted in this Section 2.1(a) + and (b) are effective on the date Initial + Developer first distributes Original Code under + the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no + patent license is granted: 1) for code that You + delete from the Original Code; 2) separate from + the Original Code; or 3) for infringements + caused by: i) the modification of the Original + Code or ii) the combination of the Original Code + with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, + each Contributor hereby grants You a world-wide, + royalty-free, non-exclusive license + + (a) under intellectual property rights (other + than patent or trademark) Licensable by + Contributor, to use, reproduce, modify, display, + perform, sublicense and distribute the + Modifications created by such Contributor (or + portions thereof) either on an unmodified basis, + with other Modifications, as Covered Code and/or + as part of a Larger Work; + and + + (b) under Patent Claims infringed by the making, + using, or selling of Modifications made by that + Contributor either alone and/or in combination + with its Contributor Version (or portions of such + combination), to make, use, sell, offer for sale, + have made, and/or otherwise dispose of: 1) + Modifications made by that Contributor (or + portions thereof); and 2) the combination of + Modifications made by that Contributor with its + Contributor Version (or portions of such + combination). + + (c) the licenses granted in Sections 2.2(a) and + 2.2(b) are effective on the date Contributor + first makes Commercial Use of the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no + patent license is granted: 1) for any code that + Contributor has deleted from the Contributor + Version; 2) separate from the Contributor + Version; 3) for infringements caused by: i) + third party modifications of Contributor Version + or ii) the combination of Modifications made by + that Contributor with other software (except as + part of the Contributor Version) or other + devices; or 4) under Patent Claims infringed by + Covered Code in the absence of Modifications made + by that Contributor. + + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You + contribute are governed by the terms of this License, + including without limitation Section 2.2. The Source + Code version of Covered Code may be distributed only + under the terms of this License or a future version of + this License released under Section 6.1, and You must + include a copy of this License with every copy of the + Source Code You distribute. You may not offer or + impose any terms on any Source Code version that + alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, + You may include an additional document offering the + additional rights described in Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You + contribute must be made available in Source Code form + under the terms of this License either on the same + media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom + you made an Executable version available; and if made + available via Electronic Distribution Mechanism, must + remain available for at least twelve (12) months after + the date it initially became available, or at least + six (6) months after a subsequent version of that + particular Modification has been made available to + such recipients. You are responsible for ensuring that + the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a + third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You + contribute to contain a file documenting the changes + You made to create that Covered Code and the date of + any change. You must include a prominent statement + that the Modification is derived, directly or + indirectly, from Original Code provided by the Initial + Developer and including the name of the Initial + Developer in (a) the Source Code, and (b) in any + notice in an Executable version or related + documentation in which You describe the origin or + ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under + a third party's intellectual property rights is + required to exercise the rights granted by such + Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the + Source Code distribution titled "LEGAL'' which + describes the claim and the party making the + claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such + knowledge after the Modification is made + available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file + in all copies Contributor makes available + thereafter and shall take other steps (such as + notifying appropriate mailing lists or + newsgroups) reasonably calculated to inform those + who received the Covered Code that new knowledge + has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an + application programming interface and Contributor + has knowledge of patent licenses which are + reasonably necessary to implement that API, + Contributor must also include this information in + the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed + pursuant to Section 3.4(a) above, Contributor + believes that Contributor's Modifications are + Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the + rights conveyed by this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each + file of the Source Code. If it is not possible to put + such notice in a particular Source Code file due to + its structure, then You must include such notice in a + location (such as a relevant directory) where a user + would be likely to look for such a notice. If You + created one or more Modification(s) You may add your + name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in + any documentation for the Source Code where You + describe recipients' rights or ownership rights + relating to Covered Code. You may choose to offer, + and to charge a fee for, warranty, support, indemnity + or liability obligations to one or more recipients of + Covered Code. However, You may do so only on Your own + behalf, and not on behalf of the Initial Developer or + any Contributor. You must make it absolutely clear + than any such warranty, support, indemnity or + liability obligation is offered by You alone, and You + hereby agree to indemnify the Initial Developer and + every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of + warranty, support, indemnity or liability terms You + offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form + only if the requirements of Section 3.1-3.5 have been + met for that Covered Code, and if You include a notice + stating that the Source Code version of the Covered + Code is available under the terms of this License, + including a description of how and where You have + fulfilled the obligations of Section 3.2. The notice + must be conspicuously included in any notice in an + Executable version, related documentation or + collateral in which You describe recipients' rights + relating to the Covered Code. You may distribute the + Executable version of Covered Code or ownership rights + under a license of Your choice, which may contain + terms different from this License, provided that You + are in compliance with the terms of this License and + that the license for the Executable version does not + attempt to limit or alter the recipient's rights in + the Source Code version from the rights set forth in + this License. If You distribute the Executable version + under a different license You must make it absolutely + clear that any terms which differ from this License + are offered by You alone, not by the Initial Developer + or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any + liability incurred by the Initial Developer or such + Contributor as a result of any such terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code + with other code not governed by the terms of this + License and distribute the Larger Work as a single + product. In such a case, You must make sure the + requirements of this License are fulfilled for the + Covered Code. + + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the + terms of this License with respect to some or all of + the Covered Code due to statute, judicial order, or + regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. + Such description must be included in the LEGAL file + described in Section 3.4 and must be included with all + distributions of the Source Code. Except to the extent + prohibited by statute or regulation, such description + must be sufficiently detailed for a recipient of + ordinary skill to be able to understand it. + + +5. Application of this License. + + This License applies to code to which the Initial + Developer has attached the notice in Exhibit A and to + related Covered Code. + + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation (''Netscape'') may + publish revised and/or new versions of the License + from time to time. Each version will be given a + distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a + particular version of the License, You may always + continue to use it under the terms of that version. + You may also choose to use such Covered Code under the + terms of any subsequent version of the License + published by Netscape. No one other than Netscape has + the right to modify the terms applicable to Covered + Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this + License (which you may only do in order to apply it to + code which is not already Covered Code governed by + this License), You must (a) rename Your license so + that the phrases ''Mozilla'', ''MOZILLAPL'', + ''MOZPL'', ''Netscape'', "MPL", ''NPL'' or any + confusingly similar phrase do not appear in your + license (except to note that your license differs from + this License) and (b) otherwise make it clear that + Your version of the license contains terms which + differ from the Mozilla Public License and Netscape + Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice + described in Exhibit A shall not of themselves be + deemed to be modifications of this License.) + + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS + IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, + WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, + MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- + INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND + PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD + ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU + (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) + ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR + CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN + ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED + CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS + DISCLAIMER. + + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder + will terminate automatically if You fail to comply + with terms herein and fail to cure such breach within + 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly + granted shall survive any termination of this License. + Provisions which, by their nature, must remain in + effect beyond the termination of this License shall + survive. + + 8.2. If You initiate litigation by asserting a patent + infringement claim (excluding declatory judgment + actions) against Initial Developer or a Contributor + (the Initial Developer or Contributor against whom You + file such action is referred to as "Participant") + alleging that: + + (a) such Participant's Contributor Version directly + or indirectly infringes any patent, then any and all + rights granted by such Participant to You under + Sections 2.1 and/or 2.2 of this License shall, upon 60 + days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You + either: (i) agree in writing to pay Participant a + mutually agreeable reasonable royalty for Your past + and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim + with respect to the Contributor Version against such + Participant. If within 60 days of notice, a + reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the + litigation claim is not withdrawn, the rights granted + by Participant to You under Sections 2.1 and/or 2.2 + automatically terminate at the expiration of the 60 + day notice period specified above. + + (b) any software, hardware, or device, other than + such Participant's Contributor Version, directly or + indirectly infringes any patent, then any rights + granted to You by such Participant under Sections 2.1 + (b) and 2.2(b) are revoked effective as of the date + You first made, used, sold, distributed, or had made, + Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim + against Participant alleging that such Participant's + Contributor Version directly or indirectly infringes + any patent where such claim is resolved (such as by + license or settlement) prior to the initiation of + patent infringement litigation, then the reasonable + value of the licenses granted by such Participant + under Sections 2.1 or 2.2 shall be taken into account + in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 + or 8.2 above, all end user license agreements + (excluding distributors and resellers) which have been + validly granted by You or any distributor hereunder + prior to termination shall survive termination. + + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, + WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR + OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER + CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR + ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY + PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, + WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK + STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND + ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH + PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF + SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT + APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT + APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME + JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION + OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS + EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a ''commercial item,'' as that + term is defined in 48 C.F.R. 2.101 (Oct. 1995), + consisting of ''commercial computer software'' and + ''commercial computer software documentation,'' as + such terms are used in 48 C.F.R. 12.212 (Sept. 1995). + Consistent with 48 C.F.R. 12.212 and 48 C.F.R. + 227.7202-1 through 227.7202-4 (June 1995), all U.S. + Government End Users acquire Covered Code with only + those rights set forth herein. + + +11. MISCELLANEOUS. + + This License represents the complete agreement + concerning subject matter hereof. If any provision of + this License is held to be unenforceable, such + provision shall be reformed only to the extent + necessary to make it enforceable. This License shall + be governed by California law provisions (except to + the extent applicable law, if any, provides + otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party + is a citizen of, or an entity chartered or registered + to do business in the United States of America, any + litigation relating to this License shall be subject + to the jurisdiction of the Federal Courts of the + Northern District of California, with venue lying in + Santa Clara County, California, with the losing party + responsible for costs, including without limitation, + court costs and reasonable attorneys' fees and + expenses. The application of the United Nations + Convention on Contracts for the International Sale of + Goods is expressly excluded. Any law or regulation + which provides that the language of a contract shall + be construed against the drafter shall not apply to + this License. + + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, + each party is responsible for claims and damages + arising, directly or indirectly, out of its + utilization of rights under this License and You agree + to work with Initial Developer and Contributors to + distribute such responsibility on an equitable basis. + Nothing herein is intended or shall be deemed to + constitute any admission of liability. + + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the + Covered Code as Multiple-Licensed. Multiple-Licensed + means that the Initial Developer permits you to + utilize portions of the Covered Code under Your choice + of the NPL or the alternative licenses, if any, + specified by the Initial Developer in the file + described in Exhibit A. + + + +EXHIBIT A - Mozilla Public License. + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is + ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms of + the _____ license (the [___] License), in which case the provisions of + [______] License are applicable instead of those above. If you wish to + allow use of your version of this file only under the terms of the [____] + License and not to allow others to use your version of this file under + the MPL, indicate your decision by deleting the provisions above and + replace them with the notice and other provisions required by the [___] + License. If you do not delete the provisions above, a recipient may use + your version of this file under either the MPL or the [___] License. + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should use + the text of this Exhibit A rather than the text found in the Original Code + Source Code for Your Modifications.] + diff --git a/externals/vegas/README b/externals/vegas/README new file mode 100644 index 0000000000..1e7a2b7099 --- /dev/null +++ b/externals/vegas/README @@ -0,0 +1,29 @@ +VEGAS AS3 - version 1.8.5.2228 + +The "vegas.swc" library contains all the AS3 source code of the VEGAS project with all this extensions. + +LICENCE + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + +PROJECT PAGES + + * http://code.google.com/p/vegas/ + +DOCUMENTATION & CO + + * http://code.google.com/p/vegas/ (tutorials and install) + * http://code.google.com/p/vegas/issues/list (issues) + * http://www.ekameleon.net/vegas/docs + + * http://www.ekameleon.net/blog/ (french blog) + +ABOUT AUTHOR + + * Author : ALCARAZ Marc (eKameleon) + * Link : http://www.ekameleon.net/blog + * Mail : ekameleon@gmail.com + +NOTES + +The vegas.swc file target now the FlashPlayer 10.2 and build with the Flex SDK 4.5.0.19786. \ No newline at end of file diff --git a/externals/vegas/src/system/Serializer.as b/externals/vegas/src/system/Serializer.as new file mode 100644 index 0000000000..afeb63dfcb --- /dev/null +++ b/externals/vegas/src/system/Serializer.as @@ -0,0 +1,86 @@ +/* + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the + License. + + The Original Code is [maashaack framework]. + + The Initial Developers of the Original Code are + Zwetan Kjukov and Marc Alcaraz . + Portions created by the Initial Developers are Copyright (C) 2006-2011 + the Initial Developers. All Rights Reserved. + + Contributor(s): + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the LGPL or the GPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. +*/ + +package system +{ + + /** + * Defines what a Serializer have to implements to be integrated in the framework. + *

Note : Every serializers (eden, json, wddx, etc.) should implement it.

+ */ + public interface Serializer + { + /** + * The prettyIndent value of the serializer. + */ + function get prettyIndent():int; + + /** + * @private + */ + function set prettyIndent( value:int ):void; + + /** + * The prettyPrinting value of the serializer. + */ + function get prettyPrinting():Boolean; + + /** + * @private + */ + function set prettyPrinting( value:Boolean ):void; + + /** + * The identor String value of the serializer. + */ + function get indentor():String; + + /** + * @private + */ + function set indentor( value:String ):void; + + /** + * Deserialize the specified String source representation. + */ + function deserialize( source:String ):*; + + /** + * Serialize the specified object. + */ + function serialize( value:* ):String; + } +} + diff --git a/externals/vegas/src/vegas/strings/JSON.as b/externals/vegas/src/vegas/strings/JSON.as new file mode 100644 index 0000000000..8dcb4ff95f --- /dev/null +++ b/externals/vegas/src/vegas/strings/JSON.as @@ -0,0 +1,107 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is VEGAS Framework. + + The Initial Developer of the Original Code is + ALCARAZ Marc (aka eKameleon) . + Portions created by the Initial Developer are Copyright (C) 2004-2011 + the Initial Developer. All Rights Reserved. + + Contributor(s) : + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the LGPL or the GPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ +package vegas.strings +{ + import vegas.strings.json.JSONSerializer; + + /** + * JSON (JavaScript object Notation) is a lightweight data-interchange format. + *

More information in the official site : http://www.JSON.org

+ *

Add Hexa Digits tool in deserialize method - eden inspiration

+ * + * @example Example + * + * + * import core.getClassName ; + * + * import vegas.strings.JSON; + * import vegas.strings.errors.JSONError; + * + * // --- Init + * + * var a:Array = [2, true, "hello"] ; + * var o:Object = { prop1 : 1 , prop2 : 2 } ; + * var s:String = "hello world" ; + * var n:Number = 4 ; + * var b:Boolean = true ; + * + * trace("# Serialize \r") ; + * + * trace("- a : " + JSON.serialize( a ) ) ; + * trace("- o : " + JSON.serialize( o ) ) ; + * trace("- s : " + JSON.serialize( s ) ) ; + * trace("- n : " + JSON.serialize( n ) ) ; + * trace("- b : " + JSON.serialize( b ) ) ; + * + * trace ("\r# Deserialize \r") ; + * + * var source:String = '[ { "prop1" : 0xFF0000 , prop2:2, prop3:"hello", prop4:true} , 2, true, 3, [3, 2] ]' ; + * + * o = JSON.deserialize(source) ; + * + * var l:uint = o.length ; + * for (var i:uint = 0 ; i < l ; i++) + * { + * trace("> " + i + " : " + o[i] + " -> typeof :: " + typeof(o[i])) ; + * if (typeof(o[i]) == "object") + * { + * for (var each:String in o[i]) + * { + * trace(" > " + each + " : " + o[i][each] + " :: " + getClassName(o[i][each]) ) ; + * } + * } + * } + * + * trace ("\r# JSONError \r") ; + * + * source = "[3, 2," ; // test1 + * + * // var source:String = '{"prop1":coucou"}' ; // test2 + * + * try + * { + * var errorObj:Object = JSON.deserialize(source) ; + * } + * catch( e:JSONError ) + * { + * trace( e.toString() ) ; + * } + * + * + */ + public var JSON:JSONSerializer = new JSONSerializer() ; +} \ No newline at end of file diff --git a/externals/vegas/src/vegas/strings/json/JSONError.as b/externals/vegas/src/vegas/strings/json/JSONError.as new file mode 100644 index 0000000000..0e1b20dfaf --- /dev/null +++ b/externals/vegas/src/vegas/strings/json/JSONError.as @@ -0,0 +1,84 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is VEGAS Framework. + + The Initial Developer of the Original Code is + ALCARAZ Marc (aka eKameleon) . + Portions created by the Initial Developer are Copyright (C) 2004-2011 + the Initial Developer. All Rights Reserved. + + Contributor(s) : + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the LGPL or the GPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ + +package vegas.strings.json +{ + /** + * This JSONError is throw in the JSON static methods. + */ + public class JSONError extends Error + { + /** + * Creates a new JSONError instance. + */ + public function JSONError( message:String, at:uint, source:String , id:int=0 ) + { + super( message , id ); + name = "JSONError" ; + this.at = at ; + this.source = source ; + } + + /** + * The position of char with an error parsing in the JSON String representation. + */ + public var at:uint ; + + /** + * The source ot the bad parsing. + */ + public var source:String ; + + /** + * Returns a String representation of the object. + * @return a String representation of the object. + */ + public function toString():String + { + var msg:String = "## " + name + " : " + message + " ##" ; + if (!isNaN(at)) + { + msg += ", at:" + at ; + } + if ( source != null ) + { + msg += " in \"" + source + "\""; + } + return msg ; + } + } +} \ No newline at end of file diff --git a/externals/vegas/src/vegas/strings/json/JSONSerializer.as b/externals/vegas/src/vegas/strings/json/JSONSerializer.as new file mode 100644 index 0000000000..5da0afe267 --- /dev/null +++ b/externals/vegas/src/vegas/strings/json/JSONSerializer.as @@ -0,0 +1,757 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is VEGAS Framework. + + The Initial Developer of the Original Code is + ALCARAZ Marc (aka eKameleon) . + Portions created by the Initial Developer are Copyright (C) 2004-2011 + the Initial Developer. All Rights Reserved. + + Contributor(s) : + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the LGPL or the GPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ + +package vegas.strings.json +{ + import system.Serializer; + + /** + * This class is the concrete class of the JSON singleton. + * JSON (JavaScript object Notation) is a lightweight data-interchange format. + *

More information in the official site : http://www.JSON.org

+ *

Add Hexa Digits tool in deserialize method - eden inspiration

+ *

Example :

+ *
+     * import core.getClassName ;
+     * 
+     * import vegas.strings.JSON;
+     * import vegas.strings.JSONError;
+     * 
+     * // --- Init
+     * 
+     * var a:Array   = [2, true, "hello"] ;
+     * var o:Object  = { prop1 : 1 , prop2 : 2 } ;
+     * var s:String  = "hello world" ;
+     * var n:Number  = 4 ;
+     * var b:Boolean = true ;
+     * 
+     * trace("Serialize") ;
+     * 
+     * trace("- a : " + JSON.serialize( a ) )  ;
+     * trace("- o : " + JSON.serialize( o ) )  ;
+     * trace("- s : " + JSON.serialize( s ) )  ;
+     * trace("- n : " + JSON.serialize( n ) )  ;
+     * trace("- b : " + JSON.serialize( b ) )  ;
+     * 
+     * trace ("Deserialize") ;
+     * 
+     * var source:String = '[ { "prop1" : 0xFF0000 , prop2:2, prop3:"hello", prop4:true} , 2, true, 3, [3, 2] ]' ;
+     * 
+     * o = JSON.deserialize(source) ;
+     * 
+     * var l:uint = o.length ;
+     * for (var i:uint = 0 ; i < l ; i++)
+     * {
+     *     trace("- " + i + " : " + o[i] + " , typeof :: " + typeof(o[i])) ;
+     *     if (typeof(o[i]) == "object")
+     *     {
+     *         for (var each:String in o[i])
+     *         {
+     *             trace("    + " + each + " : " + o[i][each] + " :: " + getClassName(o[i][each]) ) ;
+     *         }
+     *     }
+     * }
+     * 
+     * trace ("JSONError") ;
+     * 
+     * source = "[3, 2," ; // test1
+     * 
+     * // var source:String = '{"prop1":coucou"}' ; // test2
+     * 
+     * try
+     * {
+     *    var errorObj:Object = JSON.deserialize(source) ;
+     * }
+     * catch( e:JSONError )
+     * {
+     *     trace( e.toString() ) ;
+     * }
+     * 
+ */ + public class JSONSerializer implements Serializer + { + /** + * Creates a new JSONSerializer instance. + */ + public function JSONSerializer() + { + // + } + + /** + * The source to evaluate. + */ + public var source:String ; + + /** + * Indicates the indentor string representation. + */ + public function get indentor():String + { + return _indentor; + } + + /** + * @private + */ + public function set indentor(value:String):void + { + _indentor = value; + } + + /** + * Indicates the pretty indent value. + */ + public function get prettyIndent():int + { + return _prettyIndent; + } + + /** + * @private + */ + public function set prettyIndent(value:int):void + { + _prettyIndent = value ; + } + + /** + * Indicates the pretty printing flag value. + */ + public function get prettyPrinting():Boolean + { + return _prettyPrinting ; + } + + /** + * @private + */ + public function set prettyPrinting(value:Boolean):void + { + _prettyPrinting = value; + } + + /** + * Parse a string and interpret the source code to the correct object construct. + *

Example :

+ *
+         * "hello world" --> "hello world"
+         * "0xFF"        --> 255
+         * "{a:1,"b":2}" --> {a:1,b:2}
+         * 
+ * @return a string representing the data. + */ + public function deserialize( source:String ):* + { + this.source = source ; + at = 0 ; + ch = ' ' ; + return value() ; + } + + /** + * Serialize the specified value object passed-in argument. + */ + public function serialize( value:* ):String + { + var c:String ; // char + var i:int ; + var l:int ; + var s:String = '' ; + var v:* ; + var tof:String = typeof(value) ; + switch (tof) + { + case 'object' : + { + if (value) + { + if (value is Array) + { + l = (value as Array).length ; + for (i = 0 ; i < l ; ++i) + { + v = serialize(value[i]); + if (s) s += ',' ; + s += v ; + } + return '[' + s + ']'; + } + else if ( typeof( value.toString ) != 'undefined') + { + for (var prop:String in value) + { + v = value[prop]; + if ( (typeof(v) != 'undefined') && (typeof(v) != 'function') ) + { + v = serialize(v); + if (s) + { + s += ',' ; + } + s += serialize(prop) + ':' + v ; + } + } + return "{" + s + "}"; + } + } + return 'null'; + } + case 'number': + { + return isFinite(value) ? String(value) : 'null' ; + } + case 'string' : + { + l = (value as String).length ; + s = '"' ; + for (i = 0 ; i < l ; i += 1) + { + c = (value as String).charAt(i) ; + if (c >= ' ') + { + if (c == '\\' || c == '"') + { + s += '\\'; + } + s += c; + } + else + { + switch (c) + { + case '\b': + { + s += '\\b'; + break ; + } + case '\f' : + { + s += '\\f' ; + break ; + } + case '\n' : + { + s += '\\n' ; + break ; + } + case '\r': + { + s += '\\r' ; + break ; + } + case '\t': + { + s += '\\t' ; + break ; + } + default: + { + var code:Number = c.charCodeAt() ; + s += '\\u00' + String(Math.floor(code / 16).toString(16)) + ((code % 16).toString(16)) ; + } + } + } + } + return s + '"' ; + } + case 'boolean' : + { + return String(value); + } + default : + { + return 'null'; + } + } + } + + /** + * The current position of the iterator in the source. + */ + protected var at:Number = 0 ; + + /** + * The current character of the iterator in the source. + */ + protected var ch:String = ' ' ; + + /** + * Check the Array objects in the source expression. + */ + protected function array():Array + { + var a:Array = []; + if ( ch == '[' ) + { + next() ; + white() ; + if (ch == ']') + { + next(); + return a; + } + while (ch) + { + a.push( value() ) ; + white(); + if (ch == ']') + { + next(); + return a; + } + else if (ch != ',') + { + break; + } + next(); + white(); + } + } + error( JSONStrings.badArray ); + return null ; + } + + /** + * Throws a JSONError with the passed-in message. + */ + protected function error( m:String ):void + { + throw new JSONError( m, at - 1 , source) ; + } + + /** + * Indicates if the passed-in character is a digit. + */ + protected function isDigit( c:String ):Boolean + { + return( ("0" <= c) && (c <= "9") ); + } + + /** + * Indicates if the passed-in character is a hexadecimal digit. + */ + protected function isHexDigit( c:String ):Boolean + { + return( isDigit( c ) || (("A" <= c) && (c <= "F")) || (("a" <= c) && (c <= "f")) ); + } + + /** + * Indicates if the current character is a key. + */ + protected function key():* + { + var s:String = ch ; + var semiColon:int = source.indexOf( ':' , at ) ; + var quoteIndex:int = source.indexOf( '"' , at ) ; + var squoteIndex:int = source.indexOf( "'" , at ) ; + if( (quoteIndex <= semiColon && quoteIndex > -1) || (squoteIndex <= semiColon && squoteIndex > -1)) + { + s = string() ; + white() ; + if(ch == ':') + { + return s; + } + else + { + error(JSONStrings.badKey); + } + } + while ( next() ) // Use key handling + { + if (ch == ':') + { + return s; + } + if(ch <= ' ') + { + // + } + else + { + s += ch; + } + } + error( JSONStrings.badKey ) ; + } + + /** + * Returns the next character in the source String representation. + * @return the next character in the source String representation. + */ + protected function next():String + { + ch = source.charAt(at); + at += 1; + return ch; + } + + /** + * Check the Number values in the source expression. + */ + protected function number():* + { + + var n:* = '' ; + var v:* ; + var hex:String = '' ; + var sign:String = '' ; + if (ch == '-') + { + n = '-'; + sign = n ; + next(); + } + if( ch == "0" ) + { + next() ; + if( ( ch == "x") || ( ch == "X") ) + { + next(); + while( isHexDigit( ch ) ) + { + hex += ch ; + next(); + } + if( hex == "" ) + { + error(JSONStrings.malFormedHexadecimal) ; + } + else + { + return Number( sign + "0x" + hex ) ; + } + } + else + { + n += "0" ; + } + } + while ( isDigit(ch) ) + { + n += ch ; + next() ; + } + if (ch == '.') + { + n += '.'; + while (next() && ch >= '0' && ch <= '9') + { + n += ch ; + } + } + v = 1 * n ; + if (!isFinite(v)) + { + error( JSONStrings.badNumber ); + } + else + { + return v ; + } + return NaN ; + } + + /** + * Check the Object values in the source expression. + */ + protected function object():* + { + var k:* = {} ; + var o:* = {} ; + if (ch == '{') + { + next(); + white(); + if (ch == '}') + { + next() ; + return o ; + } + while (ch) + { + k = key() ; + white(); + if (ch != ':') + { + break; + } + next(); + o[k] = value() ; + white(); + if (ch == '}') + { + next(); + return o; + } + else if (ch != ',') + { + break; + } + next(); + white(); + } + } + error( JSONStrings.badObject ) ; + } + + /** + * Check the string objects in the source expression. + */ + protected function string():* + { + var i:* = '' ; + var s:* = '' ; + var t:* ; + var u:* ; + var outer:Boolean ; + if (ch == '"' || ch == "'" ) + { + var outerChar:String = ch ; + while ( next() ) + { + if (ch == outerChar) + { + next() ; + return s ; + } + else if (ch == '\\') + { + switch ( next() ) + { + case 'b': + { + s += '\b' ; + break ; + } + case 'f' : + { + s += '\f'; + break ; + } + case 'n': + { + s += '\n'; + break ; + } + case 'r' : + { + s += '\r'; + break ; + } + case 't' : + { + s += '\t' ; + break ; + } + case 'u' : + { + u = 0; + for (i = 0; i < 4; i += 1) + { + t = parseInt( next() , 16 ) ; + if (!isFinite(t)) + { + outer = true; + break; + } + u = u * 16 + t; + } + if(outer) + { + outer = false; + break; + } + s += String.fromCharCode(u); + break; + } + default : + { + s += ch; + } + } + } + else + { + s += ch; + } + } + } + error( JSONStrings.badString ); + return null ; + } + + /** + * Evaluates the values in the source expression. + */ + protected function value():* + { + white() ; + if (ch == '{' ) + { + return object(); + } + else if ( ch == '[' ) + { + return array(); + } + else if ( ch == '"' || ch == "'" ) + { + return string(); + } + else if ( ch == '-' ) + { + return number(); + } + else + { + return ( ch >= '0' && ch <= '9' ) ? number() : word() ; + } + } + + /** + * Check all white spaces. + */ + protected function white():void + { + while (ch) + { + if (ch <= ' ') + { + next(); + } + else if (ch == '/') + { + switch ( next() ) + { + case '/' : + { + while ( next() && ch != '\n' && ch != '\r') + { + } + break; + } + case '*' : + { + next(); + for (;;) + { + if (ch) + { + if (ch == '*') + { + if ( next() == '/' ) + { + next(); + break; + } + } + else + { + next(); + } + } + else + { + error( JSONStrings.unterminatedComment ); + } + } + break ; + } + default : + { + error( JSONStrings.syntaxError ); + } + } + } + else + { + break ; + } + } + } + + /** + * Check all special words in the source to evaluate. + */ + protected function word():* + { + if (ch == 't') + { + if (next() == 'r' && next() == 'u' && next() == 'e') + { + next() ; + return true ; + } + } + else if ( ch == 'f' ) + { + if (next() == 'a' && next() == 'l' && next() == 's' && next() == 'e') + { + next() ; + return false ; + } + } + else if ( ch == 'n' ) + { + if (next() == 'u' && next() == 'l' && next() == 'l') + { + next() ; + return null ; + } + } + error( JSONStrings.syntaxError ); + return null ; + } + + /** + * @private + */ + private var _prettyIndent:int = 0 ; + + /** + * @private + */ + private var _prettyPrinting:Boolean ; + + /** + * @private + */ + private var _indentor:String = " " ; + } +} diff --git a/externals/vegas/src/vegas/strings/json/JSONStrings.as b/externals/vegas/src/vegas/strings/json/JSONStrings.as new file mode 100644 index 0000000000..042876a694 --- /dev/null +++ b/externals/vegas/src/vegas/strings/json/JSONStrings.as @@ -0,0 +1,85 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is VEGAS Framework. + + The Initial Developer of the Original Code is + ALCARAZ Marc (aka eKameleon) . + Portions created by the Initial Developer are Copyright (C) 2004-2011 + the Initial Developer. All Rights Reserved. + + Contributor(s) : + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the LGPL or the GPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ + +package vegas.strings.json +{ + /** + * The string messages used in the JSON class. + */ + public class JSONStrings + { + /** + * The bad Array error message. + */ + public static var badArray:String = "Bad Array" ; + + /** + * The bad key error message. + */ + public static var badKey:String = "Bad key" ; + + /** + * The bad Number error message. + */ + public static var badNumber:String = "Bad Number" ; + + /** + * The bad Object error message. + */ + public static var badObject:String = "Bad Object" ; + + /** + * The bad String error message. + */ + public static var badString:String = "Bad String" ; + + /** + * The mal formed Hexadecimal error message. + */ + public static var malFormedHexadecimal:String = "Mal formed Hexadecimal" ; + + /** + * The syntax error message. + */ + public static var syntaxError:String = "Syntax Error" ; + + /** + * The unterminated comment error message. + */ + public static var unterminatedComment:String = "Unterminated Comment" ; + } +} \ No newline at end of file diff --git a/src/infrastructure/lint/engine/PhabricatorLintEngine.php b/src/infrastructure/lint/engine/PhabricatorLintEngine.php index 3ecb4cc01d..217709152a 100644 --- a/src/infrastructure/lint/engine/PhabricatorLintEngine.php +++ b/src/infrastructure/lint/engine/PhabricatorLintEngine.php @@ -33,6 +33,11 @@ class PhabricatorLintEngine extends PhutilLintEngine { $linters[] = $javelin_linter; foreach ($paths as $path) { + if (strpos($path, 'support/aphlict/') !== false) { + // This stuff is Node.js, not Javelin, so don't apply the Javelin + // linter. + continue; + } if (preg_match('/\.js$/', $path)) { $javelin_linter->addPath($path); $javelin_linter->addData($path, $this->loadData($path)); diff --git a/support/aphlict/client/build_aphlict_client.sh b/support/aphlict/client/build_aphlict_client.sh new file mode 100755 index 0000000000..035b9ca80b --- /dev/null +++ b/support/aphlict/client/build_aphlict_client.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +BASEDIR=`dirname $0` +ROOT=`cd $BASEDIR/../../../ && pwd`; + +if [ -z "$MXMLC" ]; then + echo "ERROR: Define environmental variable MXMLC to point to 'mxmlc' binary."; + exit 1; +fi; + +set -e +set -x + +# cp -R $ROOT/externals/vegas/src $BASEDIR/src/vegas + +(cd $BASEDIR && $MXMLC \ + -output aphlict.swf \ + -default-background-color=0x444444 \ + -default-size=500,500 \ + -target-player=10.2.0 \ + -warnings=true \ + -debug=true \ + -source-path=$ROOT/externals/vegas/src \ + -static-link-runtime-shared-libraries=true \ + src/Aphlict.as) + +mv $BASEDIR/aphlict.swf $ROOT/webroot/rsrc/swf/aphlict.swf diff --git a/support/aphlict/client/src/Aphlict.as b/support/aphlict/client/src/Aphlict.as new file mode 100644 index 0000000000..3359151053 --- /dev/null +++ b/support/aphlict/client/src/Aphlict.as @@ -0,0 +1,162 @@ +package { + + import flash.net.*; + import flash.utils.*; + import flash.media.*; + import flash.display.*; + import flash.events.*; + import flash.external.ExternalInterface; + + import com.phabricator.*; + + import vegas.strings.JSON; + + public class Aphlict extends Sprite { + + private var client:String; + + private var master:LocalConnection; + private var recv:LocalConnection; + private var send:LocalConnection; + + private var receiver:AphlictReceiver; + private var loyalUntil:Number = 0; + private var subjects:Array; + private var frequency:Number = 100; + + private var socket:Socket; + private var readBuffer:ByteArray; + + public function Aphlict() { + super(); + + this.master = null; + this.receiver = new AphlictReceiver(this); + this.subjects = []; + + this.send = new LocalConnection(); + + this.recv = new LocalConnection(); + this.recv.client = this.receiver; + for (var ii:Number = 0; ii < 32; ii++) { + try { + this.recv.connect('aphlict_subject_' + ii); + this.client = 'aphlict_subject_' + ii; + } catch (x:Error) { + // Some other Aphlict client is holding that ID. + } + } + + if (!this.client) { + // Too many clients open already, just exit. + return; + } + + this.usurp(); + } + + private function usurp():void { + if (this.master) { + for (var ii:Number = 0; ii < this.subjects.length; ii++) { + if (this.subjects[ii] == this.client) { + continue; + } + this.send.send(this.subjects[ii], 'remainLoyal'); + } + } else if (this.loyalUntil < new Date().getTime()) { + var recv:LocalConnection = new LocalConnection(); + recv.client = this.receiver; + try { + recv.connect('aphlict_master'); + this.master = recv; + this.subjects = [this.client]; + + this.connectToServer(); + + } catch (x:Error) { + // Can't become the master. + } + + if (!this.master) { + this.send.send('aphlict_master', 'becomeLoyal', this.client); + this.remainLoyal(); + } + } + setTimeout(this.usurp, this.frequency); + } + + public function connectToServer():void { + var socket:Socket = new Socket(); + + socket.addEventListener(Event.CONNECT, didConnectSocket); + socket.addEventListener(Event.CLOSE, didCloseSocket); + socket.addEventListener(IOErrorEvent.IO_ERROR, didErrorSocket); + socket.addEventListener(ProgressEvent.SOCKET_DATA, didReceiveSocket); + + socket.connect('127.0.0.1', 2600); + + this.readBuffer = new ByteArray(); + this.socket = socket; + } + + private function didConnectSocket(event:Event):void { + this.log("Connect!"); + } + + private function didCloseSocket(event:Event):void { + this.log("Close!"); + } + + private function didErrorSocket(event:Event):void { + this.log("Error!"); + } + + private function didReceiveSocket(event:Event):void { + var b:ByteArray = this.readBuffer; + this.socket.readBytes(b, b.length); + + do { + b = this.readBuffer; + b.position = 0; + + if (b.length <= 8) { + break; + } + + var msg_len:Number = parseInt(b.readUTFBytes(8), 10); + if (b.length >= msg_len + 8) { + var bytes:String = b.readUTFBytes(msg_len); + var data:Object = JSON.deserialize(bytes); + var t:ByteArray = new ByteArray(); + t.writeBytes(b, msg_len + 8); + this.readBuffer = t; + + for (var ii:Number = 0; ii < this.subjects.length; ii++) { + this.send.send(this.subjects[ii], 'receiveMessage', data); + } + } else { + break; + } + } while (true); + + } + + public function remainLoyal():void { + this.loyalUntil = new Date().getTime() + (2 * this.frequency); + } + + public function becomeLoyal(subject:String):void { + this.subjects.push(subject); + } + + public function receiveMessage(msg:Object):void { + this.log("Received message!"); + } + + public function log(msg:String):void { + ExternalInterface.call('console.log', msg); + } + + } + +} \ No newline at end of file diff --git a/support/aphlict/client/src/com/phabricator/AphlictReceiver.as b/support/aphlict/client/src/com/phabricator/AphlictReceiver.as new file mode 100644 index 0000000000..a7eae20a58 --- /dev/null +++ b/support/aphlict/client/src/com/phabricator/AphlictReceiver.as @@ -0,0 +1,25 @@ +package com.phabricator { + + public class AphlictReceiver { + + private var core:Object; + + public function AphlictReceiver(core:Object) { + this.core = core; + } + + public function remainLoyal():void { + this.core.remainLoyal(); + } + + public function becomeLoyal(subject:String):void { + this.core.becomeLoyal(subject); + } + + public function receiveMessage(msg:Object):void { + this.core.receiveMessage(msg); + } + + } + +} \ No newline at end of file diff --git a/support/aphlict/server/aphlict_server.js b/support/aphlict/server/aphlict_server.js new file mode 100755 index 0000000000..eedc35c581 --- /dev/null +++ b/support/aphlict/server/aphlict_server.js @@ -0,0 +1,42 @@ +var net = require('net'); + +function getFlashPolicy() { + return [ + '', + '', + '', + '', + '' + ].join("\n"); +} + +net.createServer(function(socket) { + socket.on('data', function() { + socket.write(getFlashPolicy() + '\0'); + }); +}).listen(843); + +var sp_server = net.createServer(function(socket) { + function xwrite() { + var data = {hi: "hello"}; + var serial = JSON.stringify(data); + + var length = Buffer.byteLength(serial, 'utf8'); + length = length.toString(); + while (length.length < 8) { + length = "0" + length; + } + + socket.write(length + serial); + + console.log('write : ' + length + serial); + } + + socket.on('connect', function() { + + xwrite(); + setInterval(xwrite, 1000); + + }); +}).listen(2600); diff --git a/webroot/rsrc/swf/aphlict.swf b/webroot/rsrc/swf/aphlict.swf new file mode 100644 index 0000000000000000000000000000000000000000..51c64d12681237d81d1e0652fdbc008eea57bd75 GIT binary patch literal 8031 zcmV-lAE4kvS5pf@IRF570j+xrd|Snt@0oMvX!P*o`0Y3^IdS4RQEW+mJ0aMyqc{N) zNWwcxD#=nTuq7kOP6DNvKq#dxmtK(UCZXNCZEyGP zuiX9J+YIe;yW2u^|1;;vk0eb5;ix+>5Oh86?rSca=iUN>Q zfEY@%qA5d)atC1r*p`-UJ9cmBzjD`>mZ9iGCYc;bw~P&k!YMI_$y7^vd~7V4%Cv+` zsx6U`IHtWNor-MOV9{s}rPX-cHX2H2qN!2~xGNfo#wYNNiD{lk(4Mji?CJ6F4N=Ti z>7~g?Xrw=xNZ<=n8#h_FHxLvxr$u-;zotQ{<37o*qw) z6?kZ|cqyJ^w4v2oZ^_P_-1O~kZSi}(9WCMU_(&$6aG4y8XW}Di>wPpj6b}`f@S%8m zY$SBJ$oz^5qKlX zbkxKu+O|_px5Tt>+qr+su3bBK2_y+Nk%})*B@d*c>9oXh?cUjc$(B9)2m1E(iB>J? zG*KNse`m87|9pR4R1X2_-PJc{~=2rfLeEJ8e|-s2Fd%)q#3#BzXYJORl}y zaX7t$Hrb8(WoN^i>!3~cp~uIuy!;NQQ3Ty>mzLMD#!?-JH&(;)w%k7u04n6%UQXZ;m<-3Q3mL zO01=O8AcWQ?`)l2Fs>DaUd|IlX02R0Hl7}yMVKdFw%w8k4LvEds13PC%@*sc=O{|; zVsTQoEuYX8FNITY(`uKLIBk4-+v&vKa<=)6ph6b za@h6{M@Pmq45H@m_G_*FHm$XzO>6V|wYD~&ZO8a%IGWPhx>|K9D_XnXueGhJdXX{*=kqpe-OcG}wA>Zc&sP1_)SHd9}eN?Dy- z!Nm&}d)XPPp?X0%1kuzeO9~x|K!KmptB#It&EM{=(n&R|c2%o-RgG$|uCA%BtzJ}J zS4-+h-Qv0>bxZ4()h(~SqI$ntPE?KRHfDD?T}8zurAAqKFC#irZH(9%aWKuvND(8& zjFvEJFoI_pqvecLEGCQ=FbnK}NSTdI_VKvWm+Y-Noo`#;#%XI##)l z(Ga6IFgn6$Bcpp5CCqsXbA6OKZ)MJpG3RZ?ilSmutb{qW7U?2|)YkP)Zo;!)KDWr{ zm6My4+N)63dhO)Zq;_p^@_M|7C$AT^t0QD6iWEaSfHaI0N4gPd6e)p}L>fc72`Pn? zM#>s304Ms(V%bSlJFgHKf>Y)!ASNFnydUS+jH9L0T#N}QE_ibh;Z`V>lvmiH+-DPGa1 z*htB$K82Cesy@X|jIKV#LCU)O6elTf>Qh{#0_H;z=@}r3T3J;LF6<61>)i^dra6k9 zB=2f`S=M`!P^F14&u&wAebzlp_=;>$&2Cr8u*O$ruTq97UzH8&+jV8w#v83S#@A$H zEF058cHY#Wj2|<6isInw0Q8jRrUDMq#64N@I_%`@jS@x4daqN~9$)KSH%gY;Ro;}l zfBaak!Cm!wKF|HxnDgOs7)88oEAPw(iosCVR&vFGQCE?oQtBxBtzfn%>s@oqJ*gk( z8?rGnQNCSK1oIpDM#;f?!NEn@7|q2>K(G=97T;u);n|yw*-W^{9Vk_s_(s_}Kry50 z$N9W*E08v4V`ahe?d3|KLMa*%q>D*E@0UFnZ4OME-3?58R>}Tt%}$31AIzeyt4N6Q z?b$#j7{7G3wvHPvB4KtvP{LS8 zLJ*Hb5E+=ghZuHbpCYTvmSAz*OE6e=N*qo%#_B$j_44~kwjikuDum|gsZbezK;SvV zm@fg|XMuN;T&;YT@Q2Vi%?13JwTA_cQ{XHH&La}%dgT$qKToory>e`FF5Qp-;howlyiv_jPY*XHGsaVq=$U;w6C(VT1(}1_ zRZRK0r(+g-$(h)5^H_F9VbT0~Jf|ST$%TWdx4WyvtWuZ(99CPqslTTm1n zp#JvG?)lyT9BBQWj#)-=v~Bm>Oop6uEK*-rS2wLD_VVf#D$%6EBupF?aZXe#m|Dx! z#Y|nsR5#OBI#v>wR1eT^SXH)3UD51#)0}t{>Qkk~lR8mo>0}9Xn*pc-J&Hx=fYK}| z(nWZ$Lz0RV`EsOsqz2+tbj4xUH$z`4dcRnow#`DN+WLh`Wt(vrqO2c>Asq^r5gQb) zoiNaM66XLiJ5Gx@@R*hl7Po=Lt@3q2m-`w8hm!`mwEth7VCZxWCsd16b8}-Om%2EA zevQT6Bma zDl=w}jVGjYpY)Jh$gMOnJ~CpDrvt*@79}fek>OCPFGKdKd&BD9n7TKi?oFwCGccEj zqE1oRkC(m--8=5}(#t}bVLdjIgu~ws|AZ6gY=5{``dPeQx(2(@`=}{4I@SUG9dY?gDBRbR*5`JYe>Ja3l8~1{0 z%l3$ubhlneoALBO{6IXzteo_b0Eu;67=^*;AxQ*tJsR&%jwBP#o5s&7@TBj*E5wf#}=f>#a522Oj@Wm{Vgf<*KMAPvD39_CX zBG)+M=>ofzqoI)iLXy!TKtgcW#R0Hn z?#HvUyF>T+Iy<{{p9m-7>2CwvkM?vQ-2QlP^R{>CzVcp_5Z z)%~rVt$1(kYHg=({Nc5`wfnR)jO7zJ=TR2%g-(PUy8UfVahk0qy1Tl*rry4yj#S@6 z=VBpTGd0fC8<;xE)CAK~OieTOFk?3} z^;V{BX4-8`>u2z#G4)QQqr~wEqB8Yfyx))XS)|VqrvEkazafslCK?=~!jz)Oa1?{j zY0|FfaGq;=3Er52H&#Ar$DyodvVy2e0MMcx0`rQ=ouIO3vKG&4Cu0?N@!=lsf5@y}q;-M-_K1s-@$ft?SK4WJ0nb`wo_Mn+PWM&VW*&}B5c{6*|%pNnd z$Ia{sGy8&>J!xiBX7-esJ#A*snAx*t_C+&$&dk1KW?we5ubA2M@B@SEubN*k64Ke_ z(1@SZ*?Xm%p>?yciCg=HP29Fw*u-u9!X|FtENtTTeqj@LNSnA+1PJVoUZnw12L}Qa zY84^Q^&(&(LJKZZw5(4llA(oSQqtI`l#tSzKBbfx&3%eN$~=8a87X)7DdnWX)u&XD z%Gy2!HhN2+Qbno}#n3^w1~CpeL288)Z3!(hX`W)Ot+RdO~<;QHvF7J!92+hVUH<4Xiy@w{z$|I zx3_&w#Bq|?mG8jsTuWZTbCLQgo^{%H@mx&5hvyRgH9VKvzE3+D{szefi(*B8TONT6`M;YVACDEM;lq9t9_jQ6qg6PhvtW59RuU*B z;DP5zSf41jD@s`RG)xKN(}09+^7TzJ^J@CUOqf>vFrW9V;y*>vlxOwSpz$o4I8Jgg z;~~$Qiq8p0dJ}t_@VC)U#F;x1aT&vCE9?q8m!X&Z=Oh=l$4W$l{{)vgDn0-3#M+5+ zhoUrz&$ak0?*Pqz7A|y)wO>fqaKPlh!kfk2uko4<+kxU)Hw88&pKlYt%UO1BK5uu~ zogNSWSIOu4sXExd=1_UO{9QT5 zzcYvIW}H>|zgrkHfpT*6IDd~!d#Xwi_2PfPoBw(AqzsP3rfHA&`3cbk|4+fNU-I@R zyiSWZV>MBXr^F20p`x@^mfoovrJ{wq1*lDeKA{@#3#?BIP`d=(s~Z1XfF2N_4hect zHI56==LD!zf*w(g*8n<6y6lgu{Bd;}(X8=^gFhiqdV*@OGFBOOG#JkWsz`$os3sVO zDFJv^e#xOUZU^^yG97VxF52~MhJ^8%;-l@DjpI@BMH|O(x`8+`UcVwo4Oqr5* z+o?Q%TJ*p>g}Hi8HK%XTfvNo~b z-xmICfj@1IKPvg7;P0_~o<8$_{zo6=|JMik`|^2w%ODEXzayfO-&TcZb*u8S%3oHm zQYMRz@mCO(ae7u&egb@bSIq`$;H>=~@>=At$+Fdz7zq9YtL%qrZcvP_ga4zN6G|hn zh&1sxtQtR=SL02q##^YtbF!eJf`QbGYAi-}%ql-_)qP!{Oq4x~@%)*ZHKT=rB_RHD z)eX($qR?g{tn@3{iJi)?RQ_ua{PtSk zC-?{Qd!O|Uop?%}nV#*#Ohf*wf*Hiko5IwDV{Gv*3d+40-$^YSa4Tr(cD#t`JfexI zURMdH7Qa)&q};8U!(1 zHR_KXKS{#M3mP^Q@>M(|>Wg>|X-?dS<)U(-a~^Xrn+Xk|54Qk1_0 z4E_x*CrZ94Ic?&9FEMsi-h+O8%Yywk35!XcXvYAGAvyr97zECDOdJD)?BK6zGqU3+ z_;;!nipgH`q)XvX-c=*|0pGzv-|Sm>uD`Z}pNCaDny#Us>IQ+Lp5sewWz{7!%b@uO7q z+9dvQ3+---KHMVeT{Vj^V zKSG6co`6L}8*v5TXv799NO_dP{vnUyIj%mA=Y;kIo(Jg{CR_?7;O}Fj#J}he7#Mlg@J=B3~PaXod1j(UlQ&9 zGsV3YCm_Znz{JK&6)amjb8! zY02e8SsToP-&kU`PKwn#RBUS%D%9koVom)Pa>cnNjPJ_H^;AMa`0oMpD1-bx30oy$ ze*kPfVE-v$XG)W(_b1@Ef%AdHiOPC;z?uQOL&r!$JqTq{kV0q&p*RG>5d*6~8)#9E zfW=C&PrfBKwtMuf*Ju}Faj&djRg7!j{61Z-M`H3l51M;cHgN~3tjEW563K%G zaf_XQ*{s69q8lr*p@>0v!J;Ch>~D2*S$oC!uP*x%8vCYhTqo#%%PR6o)ra-YKPxL9 z18M%Sp0lJ&*oZjMJz)XJoMfm{G7!37{8B!zmgMtW^Lf0W_+XeI4V<|55g9yz*k8{>1FoM}?L!l{uE1XF`6;0TiDfCr}&0Hha_R_FMYu zL1PMlX-Vpu${l$BsYz<`S@^XTx4Am;4#;vx&Crzb@b<2_m?`tlPtgqgc^fH9kZWq0#7^D}MF4 zn3AC|NzIBH({Ti@MX+4lQr1?kbZhP&q?If6cp9!`-Qx~rdUSU@;a)*jtU4#@LcHXh zK1_eBw+r!DU*~Lih59>u{V`3D%@^Vr#9!^;vNd_2P+gt9>97Hsa=FrhqS~^ zYU`1&AWoNq3db9qJP;PG7q#Wx78Pzez-6cv_lyOU>ej6mP1kMR5Hqi^Yp8;UPVlg) zcreY2YoEC=-KO%^eZ=FyO_#Rp^svg?vopgQ?|^8knyTBb1%ZGdP@)WaO8H=r#K@G# zm|J;kjbn2%I7eN}9{TZpT@MhysieqzV z$Sp%sR?vkBfEAT6!y8TkF<<9G6%uGhE#`s>5@O7WuXzb_?=gD$UQHrGCu}T zv|IkZ%q`c;*#ZWY`1#3f5W#Il5%&DoEqiN(u<+NOdkoD8w;9*77WO$;p|9JEI}+YD z+~xOm;%Y=IuJQZZ+Hs+x!;81h4tdGH<1DLkegx54o75+Q1z34nwOg({tTVW}vGU-9 z$2yZfc-8d5S23-gsVf}y;sO}{i>vF%9o3|!7HJVu9nxZ?B}hw=mLV-iT4}92_#H_v zalp~3sJ*HKu1lizY7RTDGtge@aN<+%)g46;XIrlgm)dZ@zn8&IAU1oi9oO4%&k484 z;e;i24L(+lUN4rEs(7*VXb7%FowV;$J+=@|)J*N!r+Mrl977!1#rvqo8G_aAq67PM zPf + + + \ No newline at end of file