/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 46 - (hide 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 dpavlin 46 /**
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