/[Frey]/trunk/static/lib/Joose/Gears.js
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/static/lib/Joose/Gears.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 46 - (show annotations)
Wed Jul 2 10:28:49 2008 UTC (15 years, 10 months ago) by dpavlin
File MIME type: application/javascript
File size: 6560 byte(s)
added upstream Joose r4755

http://code2.0beta.co.uk/moose/svn/Joose/trunk/lib
1 /**
2 * Joose.Gears is a meta class for classes that want to delegate work to gears workers
3 * @name Joose.Gears
4 * @extends Joose.Class
5 * @constructor
6 */
7 Class("Joose.Gears", {
8 isa: Joose.Class,
9 has: {
10 wp: { },
11 calls: { init: {} },
12 callIndex: { init: 0 }
13 },
14
15 methods: {
16 initialize: function () {
17 JooseGearsInitializeGears()
18 if(this.canGears()) {
19 this.wp = google.gears.factory.create('beta.workerpool');
20 var me = this;
21 this.wp.onmessage = function (a,b,message) {
22 me.handleGearsMessage(message)
23 }
24 }
25 },
26 handleGearsMessage: function (message) {
27 var paras = JSON.parse(message.text);
28 var cbName = paras.to;
29 var ret = paras.ret;
30 var object = this.calls[paras.index];
31 object[cbName].call(object, ret)
32 delete this.calls[paras.index]
33 },
34
35 canGears: function () {
36 return window.google && window.google.gears && window.google.gears.factory
37 },
38
39 /**
40 * Adds a worker to the class
41 * @function
42 * @name addWorker
43 * @param {string} Name of the worker
44 * @param {function} Function body of the worker
45 * @param {props} Optional properties for the created method (ignored)
46 * @memberof Joose.Gears
47 */
48 addWorker: function (name, func, props) {
49
50 var cbName = "on"+Joose.S.uppercaseFirst(name)
51
52 // No gears, then work inline
53 if(!this.canGears()) {
54 var wrapped = function () {
55 var ret = func.apply(this, arguments);
56 this[cbName].call(this, ret)
57 }
58 this.addMethod(name, wrapped, props)
59 return
60 }
61
62 // OK, we have gears support
63
64 var json = new Joose.SimpleRequest().getText("json2.js")
65
66 var source = "function aClass () {}; aClass.prototype."+name+" = "+func.toString()+"\n\n"+
67 "var wp = google.gears.workerPool\n" +
68 "wp.onmessage = function (a,b,message) {\n"+
69 "var paras = JSON.parse(message.text)\n"+
70 "var o = new aClass(); var ret = o."+name+".apply(o, paras.args); wp.sendMessage(JSON.stringify({ ret: ret, to: paras.cbName, index: paras.index }), message.sender)"+
71 "\n}\n\n";
72
73
74 source += json
75
76 var wp = this.wp;
77
78 var childId = wp.createWorker(source)
79
80 var me = this
81
82 var wrapped = function () {
83 var message = JSON.stringify({ args: arguments, cbName: cbName, index: me.callIndex })
84 wp.sendMessage(message, childId);
85 me.calls[me.callIndex] = this
86 me.callIndex++
87
88 }
89 this.addMethod(name, wrapped, props)
90
91 }
92 }
93 })
94
95 // Copyright 2007, Google Inc.
96 //
97 // Redistribution and use in source and binary forms, with or without
98 // modification, are permitted provided that the following conditions are met:
99 //
100 // 1. Redistributions of source code must retain the above copyright notice,
101 // this list of conditions and the following disclaimer.
102 // 2. Redistributions in binary form must reproduce the above copyright notice,
103 // this list of conditions and the following disclaimer in the documentation
104 // and/or other materials provided with the distribution.
105 // 3. Neither the name of Google Inc. nor the names of its contributors may be
106 // used to endorse or promote products derived from this software without
107 // specific prior written permission.
108 //
109 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
110 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
111 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
112 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
113 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
114 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
115 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
116 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
117 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
118 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
119 //
120 // Sets up google.gears.*, which is *the only* supported way to access Gears.
121 //
122 // Circumvent this file at your own risk!
123 //
124 // In the future, Gears may automatically define google.gears.* without this
125 // file. Gears may use these objects to transparently fix bugs and compatibility
126 // issues. Applications that use the code below will continue to work seamlessly
127 // when that happens.
128
129 // Sorry Google for modifying this :)
130 function JooseGearsInitializeGears() {
131 // We are already defined. Hooray!
132 if (window.google && google.gears) {
133 return;
134 }
135
136 var factory = null;
137
138 // Firefox
139 if (typeof GearsFactory != 'undefined') {
140 factory = new GearsFactory();
141 } else {
142 // IE
143 try {
144 factory = new ActiveXObject('Gears.Factory');
145 // privateSetGlobalObject is only required and supported on WinCE.
146 if (factory.getBuildInfo().indexOf('ie_mobile') != -1) {
147 factory.privateSetGlobalObject(this);
148 }
149 } catch (e) {
150 // Safari
151 if (navigator.mimeTypes["application/x-googlegears"]) {
152 factory = document.createElement("object");
153 factory.style.display = "none";
154 factory.width = 0;
155 factory.height = 0;
156 factory.type = "application/x-googlegears";
157 document.documentElement.appendChild(factory);
158 }
159 }
160 }
161
162 // *Do not* define any objects if Gears is not installed. This mimics the
163 // behavior of Gears defining the objects in the future.
164 if (!factory) {
165 return;
166 }
167
168 // Now set up the objects, being careful not to overwrite anything.
169 //
170 // Note: In Internet Explorer for Windows Mobile, you can't add properties to
171 // the window object. However, global objects are automatically added as
172 // properties of the window object in all browsers.
173 if (!window.google) {
174 google = {};
175 }
176
177 if (!google.gears) {
178 google.gears = {factory: factory};
179 }
180 }
181
182

  ViewVC Help
Powered by ViewVC 1.1.26