Back to index

lightning-sunbird  0.9+nobinonly
JSEvaluator.cpp
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003  *
00004  * The contents of this file are subject to the Mozilla Public License Version
00005  * 1.1 (the "License"); you may not use this file except in compliance with
00006  * the License. You may obtain a copy of the License at
00007  * http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the License is distributed on an "AS IS" basis,
00010  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00011  * for the specific language governing rights and limitations under the
00012  * License.
00013  *
00014  * The Original Code is the MRJ Carbon OJI Plugin.
00015  *
00016  * The Initial Developer of the Original Code is
00017  * Netscape Communications Corp.
00018  * Portions created by the Initial Developer are Copyright (C) 2001
00019  * the Initial Developer. All Rights Reserved.
00020  *
00021  * Contributor(s):
00022  *   Patrick C. Beard <beard@netscape.com>
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either of the GNU General Public License Version 2 or later (the "GPL"),
00026  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 /*
00039        JSEvaluator.cpp
00040  */
00041 
00042 #include "JSEvaluator.h"
00043 #include "MRJPlugin.h"
00044 #include "MRJSession.h"
00045 #include "MRJMonitor.h"
00046 #include "nsIPluginManager.h"
00047 
00048 #include <string.h>
00049 
00050 extern nsIPluginManager* thePluginManager;
00051 
00052 JSEvaluator::JSEvaluator(MRJPluginInstance* pluginInstance)
00053        :      mPluginInstance(pluginInstance)
00054 {
00055        NS_ADDREF(pluginInstance);
00056        mSession = pluginInstance->getSession();
00057        mJSMonitor = new MRJMonitor(mSession);
00058 }
00059 
00060 JSEvaluator::~JSEvaluator()
00061 {
00062        NS_IF_RELEASE(mPluginInstance);
00063        if (mJSMonitor != NULL)
00064               delete mJSMonitor;
00065 }
00066 
00067 NS_IMPL_ISUPPORTS1(JSEvaluator, nsIPluginStreamListener)
00068 
00069 const char* JSEvaluator::eval(const char* script)
00070 {
00071        JNIEnv* env = mSession->getCurrentEnv();
00072        nsIPluginStreamListener* listener = this;
00073 
00074        mJSMonitor->enter();
00075 
00076        while (mScript != NULL) {
00077               // some other thread is evaluating a script.
00078               mJSMonitor->wait();
00079        }
00080        
00081        // construct a "javascript:" URL from the passed-in script.
00082        const char* kJavaScriptPrefix = "javascript:";
00083        mScript = new char[strlen(kJavaScriptPrefix) + strlen(script) + 1];
00084        if (mScript != NULL) {
00085               strcpy(mScript, kJavaScriptPrefix);
00086               strcat(mScript, script);
00087 
00088               // start an async evaluation of this script.
00089               nsresult result = thePluginManager->GetURL((nsIPluginInstance*)mPluginInstance, mScript, NULL, (nsIPluginStreamListener*)this);
00090               
00091               // default result is NULL, in case JavaScript returns undefined value.
00092               if (mResult != NULL) {
00093                      delete[] mResult;
00094                      mResult = NULL;
00095               }
00096 
00097               // need to block until the result is ready.
00098               mJSMonitor->wait();
00099               
00100               // can now delete the script.
00101               delete[] mScript;
00102               mScript = NULL;
00103        }
00104        
00105        mJSMonitor->notifyAll();
00106        
00107        mJSMonitor->exit();
00108        
00109        return mResult;
00110 }
00111 
00112 NS_METHOD JSEvaluator::OnDataAvailable(nsIPluginStreamInfo* pluginInfo, nsIInputStream* input, PRUint32 length)
00113 {
00114        // hopefully all our data is available.
00115        mResult = new char[length + 1];
00116        if (mResult != NULL) {
00117               if (input->Read(mResult, length, &length) == NS_OK) {
00118                      // We've delayed processing the applet tag, because we
00119                      // don't know the location of the curren document yet.
00120                      mResult[length] = '\0';
00121               }
00122        }
00123        return NS_OK;
00124 }
00125 
00126 NS_METHOD JSEvaluator::OnStopBinding(nsIPluginStreamInfo* pluginInfo, nsresult status)
00127 {
00128        // the stream has been closed, notify any waiting Java threads.
00129        mJSMonitor->notifyAll();
00130        return NS_OK;
00131 }