DojoExternalInterface.as
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:9k
源码类别:

OA系统

开发平台:

Java

  1. /* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml */ /**
  2. A wrapper around Flash 8's ExternalInterface; DojoExternalInterface is needed so that we
  3. can do a Flash 6 implementation of ExternalInterface, and be able
  4. to support having a single codebase that uses DojoExternalInterface
  5. across Flash versions rather than having two seperate source bases,
  6. where one uses ExternalInterface and the other uses DojoExternalInterface.
  7. DojoExternalInterface class does a variety of optimizations to bypass ExternalInterface's
  8. unbelievably bad performance so that we can have good performance
  9. on Safari; see the blog post
  10. http://codinginparadise.org/weblog/2006/02/how-to-speed-up-flash-8s.html
  11. for details.
  12. @author Brad Neuberg, bkn3@columbia.edu
  13. */
  14. import flash.external.ExternalInterface;
  15. class DojoExternalInterface{
  16. public static var available:Boolean;
  17. public static var dojoPath = "";
  18. private static var flashMethods:Array = new Array();
  19. private static var numArgs:Number;
  20. private static var argData:Array;
  21. private static var resultData = null;
  22. public static function initialize(){
  23. // extract the dojo base path
  24. DojoExternalInterface.dojoPath = DojoExternalInterface.getDojoPath();
  25. // see if we need to do an express install
  26. var install:ExpressInstall = new ExpressInstall();
  27. if(install.needsUpdate){
  28. install.init();
  29. }
  30. // register our callback functions
  31. ExternalInterface.addCallback("startExec", DojoExternalInterface, startExec);
  32. ExternalInterface.addCallback("setNumberArguments", DojoExternalInterface,
  33. setNumberArguments);
  34. ExternalInterface.addCallback("chunkArgumentData", DojoExternalInterface,
  35. chunkArgumentData);
  36. ExternalInterface.addCallback("exec", DojoExternalInterface, exec);
  37. ExternalInterface.addCallback("getReturnLength", DojoExternalInterface,
  38. getReturnLength);
  39. ExternalInterface.addCallback("chunkReturnData", DojoExternalInterface,
  40. chunkReturnData);
  41. ExternalInterface.addCallback("endExec", DojoExternalInterface, endExec);
  42. // set whether communication is available
  43. DojoExternalInterface.available = ExternalInterface.available;
  44. DojoExternalInterface.call("loaded");
  45. }
  46. public static function addCallback(methodName:String, instance:Object, 
  47.    method:Function) : Boolean{
  48. // register DojoExternalInterface methodName with it's instance
  49. DojoExternalInterface.flashMethods[methodName] = instance;
  50. // tell JavaScript about DojoExternalInterface new method so we can create a proxy
  51. ExternalInterface.call("dojo.flash.comm._addExternalInterfaceCallback", 
  52.  methodName);
  53.  
  54. return true;
  55. }
  56. public static function call(methodName:String,
  57. resultsCallback:Function) : Void{
  58. // we might have any number of optional arguments, so we have to 
  59. // pass them in dynamically; strip out the results callback
  60. var parameters = new Array();
  61. for(var i = 0; i < arguments.length; i++){
  62. if(i != 1){ // skip the callback
  63. parameters.push(arguments[i]);
  64. }
  65. }
  66. var results = ExternalInterface.call.apply(ExternalInterface, parameters);
  67. // immediately give the results back, since ExternalInterface is
  68. // synchronous
  69. if(resultsCallback != null && typeof resultsCallback != "undefined"){
  70. resultsCallback.call(null, results);
  71. }
  72. }
  73. /** 
  74. Called by Flash to indicate to JavaScript that we are ready to have
  75. our Flash functions called. Calling loaded()
  76. will fire the dojo.flash.loaded() event, so that JavaScript can know that
  77. Flash has finished loading and adding its callbacks, and can begin to
  78. interact with the Flash file.
  79. */
  80. public static function loaded(){
  81. DojoExternalInterface.call("dojo.flash.loaded");
  82. }
  83. public static function startExec():Void{
  84. DojoExternalInterface.numArgs = null;
  85. DojoExternalInterface.argData = null;
  86. DojoExternalInterface.resultData = null;
  87. }
  88. public static function setNumberArguments(numArgs):Void{
  89. DojoExternalInterface.numArgs = numArgs;
  90. DojoExternalInterface.argData = new Array(DojoExternalInterface.numArgs);
  91. }
  92. public static function chunkArgumentData(value, argIndex:Number):Void{
  93. //getURL("javascript:dojo.debug('FLASH: chunkArgumentData, value="+value+", argIndex="+argIndex+"')");
  94. var currentValue = DojoExternalInterface.argData[argIndex];
  95. if(currentValue == null || typeof currentValue == "undefined"){
  96. DojoExternalInterface.argData[argIndex] = value;
  97. }else{
  98. DojoExternalInterface.argData[argIndex] += value;
  99. }
  100. }
  101. public static function exec(methodName):Void{
  102. // decode all of the arguments that were passed in
  103. for(var i = 0; i < DojoExternalInterface.argData.length; i++){
  104. DojoExternalInterface.argData[i] = 
  105. DojoExternalInterface.decodeData(DojoExternalInterface.argData[i]);
  106. }
  107. var instance = DojoExternalInterface.flashMethods[methodName];
  108. DojoExternalInterface.resultData = instance[methodName].apply(
  109. instance, DojoExternalInterface.argData);
  110. // encode the result data
  111. DojoExternalInterface.resultData = 
  112. DojoExternalInterface.encodeData(DojoExternalInterface.resultData);
  113. //getURL("javascript:dojo.debug('FLASH: encoded result data="+DojoExternalInterface.resultData+"')");
  114. }
  115. public static function getReturnLength():Number{
  116.  if(DojoExternalInterface.resultData == null || 
  117.   typeof DojoExternalInterface.resultData == "undefined"){
  118.   return 0;
  119.  }
  120.  var segments = Math.ceil(DojoExternalInterface.resultData.length / 1024);
  121.  return segments;
  122. }
  123. public static function chunkReturnData(segment:Number):String{
  124. var numSegments = DojoExternalInterface.getReturnLength();
  125. var startCut = segment * 1024;
  126. var endCut = segment * 1024 + 1024;
  127. if(segment == (numSegments - 1)){
  128. endCut = segment * 1024 + DojoExternalInterface.resultData.length;
  129. }
  130. var piece = DojoExternalInterface.resultData.substring(startCut, endCut);
  131. //getURL("javascript:dojo.debug('FLASH: chunking return piece="+piece+"')");
  132. return piece;
  133. }
  134. public static function endExec():Void{
  135. }
  136. private static function decodeData(data):String{
  137. // we have to use custom encodings for certain characters when passing
  138. // them over; for example, passing a backslash over as //// from JavaScript
  139. // to Flash doesn't work
  140. data = DojoExternalInterface.replaceStr(data, "&custom_backslash;", "\");
  141. data = DojoExternalInterface.replaceStr(data, "\'", "'");
  142. data = DojoExternalInterface.replaceStr(data, "\"", """);
  143. return data;
  144. }
  145. private static function encodeData(data){
  146. //getURL("javascript:dojo.debug('inside flash, data before="+data+"')");
  147. // double encode all entity values, or they will be mis-decoded
  148. // by Flash when returned
  149. data = DojoExternalInterface.replaceStr(data, "&", "&amp;");
  150. // certain XMLish characters break Flash's wire serialization for
  151. // ExternalInterface; encode these into a custom encoding, rather than
  152. // the standard entity encoding, because otherwise we won't be able to
  153. // differentiate between our own encoding and any entity characters
  154. // that are being used in the string itself
  155. data = DojoExternalInterface.replaceStr(data, '<', '&custom_lt;');
  156. data = DojoExternalInterface.replaceStr(data, '>', '&custom_gt;');
  157. // encode control characters and JavaScript delimiters
  158. data = DojoExternalInterface.replaceStr(data, "n", "\n");
  159. data = DojoExternalInterface.replaceStr(data, "r", "\r");
  160. data = DojoExternalInterface.replaceStr(data, "f", "\f");
  161. data = DojoExternalInterface.replaceStr(data, "'", "\'");
  162. data = DojoExternalInterface.replaceStr(data, '"', '"');
  163. //getURL("javascript:dojo.debug('inside flash, data after="+data+"')");
  164. return data;
  165. }
  166. /** 
  167. Flash ActionScript has no String.replace method or support for
  168. Regular Expressions! We roll our own very simple one.
  169. */
  170. private static function replaceStr(inputStr:String, replaceThis:String, 
  171.  withThis:String):String {
  172. var splitStr = inputStr.split(replaceThis)
  173. inputStr = splitStr.join(withThis)
  174. return inputStr;
  175. }
  176. private static function getDojoPath(){
  177. var url = _root._url;
  178. var start = url.indexOf("baseRelativePath=") + "baseRelativePath=".length;
  179. var path = url.substring(start);
  180. var end = path.indexOf("&");
  181. if(end != -1){
  182. path = path.substring(0, end);
  183. }
  184. return path;
  185. }
  186. }
  187. // vim:ts=4:noet:tw=0: