summaryrefslogtreecommitdiffstats
path: root/nsplugins/viewer/nsplugin.h
diff options
context:
space:
mode:
Diffstat (limited to 'nsplugins/viewer/nsplugin.h')
-rw-r--r--nsplugins/viewer/nsplugin.h339
1 files changed, 339 insertions, 0 deletions
diff --git a/nsplugins/viewer/nsplugin.h b/nsplugins/viewer/nsplugin.h
new file mode 100644
index 000000000..76d2e659b
--- /dev/null
+++ b/nsplugins/viewer/nsplugin.h
@@ -0,0 +1,339 @@
+/*
+
+ This is an encapsulation of the Netscape plugin API.
+
+ Copyright (c) 2000 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ Stefan Schimanski <1Stein@gmx.de>
+ Copyright (c) 2003-2005 George Staikos <staikos@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+
+#ifndef __NS_PLUGIN_H__
+#define __NS_PLUGIN_H__
+
+
+#include <dcopobject.h>
+#include "NSPluginClassIface.h"
+#include "NSPluginCallbackIface_stub.h"
+
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qptrqueue.h>
+#include <qdict.h>
+#include <qmap.h>
+#include <qintdict.h>
+#include <qguardedptr.h>
+
+#include <kparts/browserextension.h> // for URLArgs
+#include <kio/job.h>
+
+
+#define XP_UNIX
+#define MOZ_X11
+#include "sdk/npupp.h"
+
+typedef char* NP_GetMIMEDescriptionUPP(void);
+typedef NPError NP_InitializeUPP(NPNetscapeFuncs*, NPPluginFuncs*);
+typedef NPError NP_ShutdownUPP(void);
+
+
+#include <X11/Intrinsic.h>
+
+
+void quitXt();
+
+class KLibrary;
+class QTimer;
+
+
+class NSPluginStreamBase : public QObject
+{
+Q_OBJECT
+friend class NSPluginInstance;
+public:
+ NSPluginStreamBase( class NSPluginInstance *instance );
+ ~NSPluginStreamBase();
+
+ KURL url() { return _url; }
+ int pos() { return _pos; }
+ void stop();
+
+signals:
+ void finished( NSPluginStreamBase *strm );
+
+protected:
+ void finish( bool err );
+ bool pump();
+ bool error() { return _error; }
+ void queue( const QByteArray &data );
+ bool create( const QString& url, const QString& mimeType, void *notify, bool forceNotify = false );
+ int tries() { return _tries; }
+ void inform( );
+ void updateURL( const KURL& newURL );
+
+ class NSPluginInstance *_instance;
+ uint16 _streamType;
+ NPStream *_stream;
+ void *_notifyData;
+ KURL _url;
+ QString _fileURL;
+ QString _mimeType;
+ QByteArray _data;
+ class KTempFile *_tempFile;
+
+private:
+ int process( const QByteArray &data, int start );
+
+ unsigned int _pos;
+ QByteArray _queue;
+ unsigned int _queuePos;
+ int _tries;
+ bool _onlyAsFile;
+ bool _error;
+ bool _informed;
+ bool _forceNotify;
+};
+
+
+class NSPluginStream : public NSPluginStreamBase
+{
+ Q_OBJECT
+
+public:
+ NSPluginStream( class NSPluginInstance *instance );
+ ~NSPluginStream();
+
+ bool get(const QString& url, const QString& mimeType, void *notifyData, bool reload = false);
+ bool post(const QString& url, const QByteArray& data, const QString& mimeType, void *notifyData, const KParts::URLArgs& args);
+
+protected slots:
+ void data(KIO::Job *job, const QByteArray &data);
+ void totalSize(KIO::Job *job, KIO::filesize_t size);
+ void mimetype(KIO::Job * job, const QString &mimeType);
+ void result(KIO::Job *job);
+ void redirection(KIO::Job *job, const KURL& url);
+ void resume();
+
+protected:
+ QGuardedPtr<KIO::TransferJob> _job;
+ QTimer *_resumeTimer;
+};
+
+
+class NSPluginBufStream : public NSPluginStreamBase
+{
+ Q_OBJECT
+
+public:
+ NSPluginBufStream( class NSPluginInstance *instance );
+ ~NSPluginBufStream();
+
+ bool get( const QString& url, const QString& mimeType, const QByteArray &buf, void *notifyData, bool singleShot=false );
+
+protected slots:
+ void timer();
+
+protected:
+ QTimer *_timer;
+ bool _singleShot;
+};
+
+
+class NSPluginInstance : public QObject, public virtual NSPluginInstanceIface
+{
+ Q_OBJECT
+
+public:
+
+ // constructor, destructor
+ NSPluginInstance( NPP privateData, NPPluginFuncs *pluginFuncs, KLibrary *handle,
+ int width, int height, QString src, QString mime,
+ QString appId, QString callbackId, bool embed, WId xembed,
+ QObject *parent, const char* name=0 );
+ ~NSPluginInstance();
+
+ // DCOP functions
+ void shutdown();
+ int winId() { return _form != 0 ? XtWindow(_form) : 0; }
+ int setWindow(Q_INT8 remove=0);
+ void resizePlugin(Q_INT32 w, Q_INT32 h);
+ void javascriptResult(Q_INT32 id, QString result);
+ void displayPlugin();
+ void gotFocusIn();
+ void gotFocusOut();
+
+ // value handling
+ NPError NPGetValue(NPPVariable variable, void *value);
+ NPError NPSetValue(NPNVariable variable, void *value);
+
+ // window handling
+ NPError NPSetWindow(NPWindow *window);
+
+ // stream functions
+ NPError NPDestroyStream(NPStream *stream, NPReason reason);
+ NPError NPNewStream(NPMIMEType type, NPStream *stream, NPBool seekable, uint16 *stype);
+ void NPStreamAsFile(NPStream *stream, const char *fname);
+ int32 NPWrite(NPStream *stream, int32 offset, int32 len, void *buf);
+ int32 NPWriteReady(NPStream *stream);
+
+ // URL functions
+ void NPURLNotify(QString url, NPReason reason, void *notifyData);
+
+ // Event handling
+ uint16 HandleEvent(void *event);
+
+ // signal emitters
+ void emitStatus( const QString &message);
+ void requestURL( const QString &url, const QString &mime,
+ const QString &target, void *notify, bool forceNotify = false, bool reload = false );
+ void postURL( const QString &url, const QByteArray& data, const QString &mime,
+ const QString &target, void *notify, const KParts::URLArgs& args, bool forceNotify = false );
+
+ QString normalizedURL(const QString& url) const;
+
+public slots:
+ void streamFinished( NSPluginStreamBase *strm );
+
+private slots:
+ void timer();
+
+private:
+ friend class NSPluginStreamBase;
+
+ static void forwarder(Widget, XtPointer, XEvent *, Boolean*);
+
+ void destroy();
+
+ bool _destroyed;
+ bool _visible;
+ void addTempFile(KTempFile *tmpFile);
+ QPtrList<KTempFile> _tempFiles;
+ NSPluginCallbackIface_stub *_callback;
+ QPtrList<NSPluginStreamBase> _streams;
+ KLibrary *_handle;
+ QTimer *_timer;
+
+ NPP _npp;
+ NPPluginFuncs _pluginFuncs;
+
+ Widget _area, _form, _toplevel;
+ WId _xembed_window;
+ QString _baseURL;
+ int _width, _height;
+
+ struct Request
+ {
+ // A GET request
+ Request( const QString &_url, const QString &_mime,
+ const QString &_target, void *_notify, bool _forceNotify = false,
+ bool _reload = false)
+ { url=_url; mime=_mime; target=_target; notify=_notify; post=false; forceNotify = _forceNotify; reload = _reload; }
+
+ // A POST request
+ Request( const QString &_url, const QByteArray& _data,
+ const QString &_mime, const QString &_target, void *_notify,
+ const KParts::URLArgs& _args, bool _forceNotify = false)
+ { url=_url; mime=_mime; target=_target;
+ notify=_notify; post=true; data=_data; args=_args;
+ forceNotify = _forceNotify; }
+
+ QString url;
+ QString mime;
+ QString target;
+ QByteArray data;
+ bool post;
+ bool forceNotify;
+ bool reload;
+ void *notify;
+ KParts::URLArgs args;
+ };
+
+ NPWindow _win;
+ NPSetWindowCallbackStruct _win_info;
+ QPtrQueue<Request> _waitingRequests;
+ QMap<int, Request*> _jsrequests;
+};
+
+
+class NSPluginClass : public QObject, virtual public NSPluginClassIface
+{
+ Q_OBJECT
+public:
+
+ NSPluginClass( const QString &library, QObject *parent, const char *name=0 );
+ ~NSPluginClass();
+
+ QString getMIMEDescription();
+ DCOPRef newInstance(QString url, QString mimeType, Q_INT8 embed,
+ QStringList argn, QStringList argv,
+ QString appId, QString callbackId, Q_INT8 reload, Q_INT8 post,
+ QByteArray postData, Q_UINT32 xembed );
+ void destroyInstance( NSPluginInstance* inst );
+ bool error() { return _error; }
+
+ void setApp(const QCString& app) { _app = app; }
+ const QCString& app() const { return _app; }
+
+protected slots:
+ void timer();
+
+private:
+ int initialize();
+ void shutdown();
+
+ KLibrary *_handle;
+ QString _libname;
+ bool _constructed;
+ bool _error;
+ QTimer *_timer;
+
+ NP_GetMIMEDescriptionUPP *_NP_GetMIMEDescription;
+ NP_InitializeUPP *_NP_Initialize;
+ NP_ShutdownUPP *_NP_Shutdown;
+
+ NPPluginFuncs _pluginFuncs;
+ NPNetscapeFuncs _nsFuncs;
+
+ QPtrList<NSPluginInstance> _instances;
+ QPtrList<NSPluginInstance> _trash;
+
+ QCString _app;
+};
+
+
+class NSPluginViewer : public QObject, virtual public NSPluginViewerIface
+{
+ Q_OBJECT
+public:
+ NSPluginViewer( QCString dcopId, QObject *parent, const char *name=0 );
+ virtual ~NSPluginViewer();
+
+ void shutdown();
+ DCOPRef newClass( QString plugin );
+
+private slots:
+ void appUnregistered(const QCString& id);
+
+private:
+ QDict<NSPluginClass> _classes;
+};
+
+
+#endif