summaryrefslogtreecommitdiffstats
path: root/src/extension/implementation/script.h
blob: bc865f44898c88c84cd040120acb7c07147bba02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Code for handling extensions (i.e., scripts)
 *
 * Authors:
 *   Bryce Harrington <bryce@osdl.org>
 *   Ted Gould <ted@gould.cx>
 *
 * Copyright (C) 2002-2005 Authors
 *
 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
 */

#ifndef INKSCAPE_EXTENSION_IMPEMENTATION_SCRIPT_H_SEEN
#define INKSCAPE_EXTENSION_IMPEMENTATION_SCRIPT_H_SEEN

#include "implementation.h"
#include <gtkmm/enums.h>
#include <gtkmm/window.h>
#include <glibmm/main.h>
#include <glibmm/spawn.h>
#include <glibmm/fileutils.h>

namespace Inkscape {
namespace XML {
class Node;
} // namespace XML

namespace Extension {
namespace Implementation {

/**
 * Utility class used for loading and launching script extensions
 */
class Script : public Implementation {
public:

    Script();
    ~Script() override;
    bool load(Inkscape::Extension::Extension *module) override;
    void unload(Inkscape::Extension::Extension *module) override;
    bool check(Inkscape::Extension::Extension *module) override;

    ImplementationDocumentCache * newDocCache(Inkscape::Extension::Extension * ext, Inkscape::UI::View::View * view) override;

    Gtk::Widget *prefs_input(Inkscape::Extension::Input *module, gchar const *filename) override;
    SPDocument *open(Inkscape::Extension::Input *module, gchar const *filename) override;
    Gtk::Widget *prefs_output(Inkscape::Extension::Output *module) override;
    void save(Inkscape::Extension::Output *module, SPDocument *doc, gchar const *filename) override;
    void export_raster(Inkscape::Extension::Output *module,
            const SPDocument *doc, std::string const &png_file, gchar const *filename) override;
    void effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View *doc, ImplementationDocumentCache * docCache) override;
    bool cancelProcessing () override;

private:
    bool _canceled;
    Glib::Pid _pid;
    Glib::RefPtr<Glib::MainLoop> _main_loop;

    /**
     * The command that has been derived from
     * the configuration file with appropriate directories
     */
    std::list<std::string> command;

     /**
      * This is the extension that will be used
      * as the helper to read in or write out the
      * data
      */
    Glib::ustring helper_extension;

     /**
      * The window which should be considered as "parent window" of the script execution,
      * e.g. when showin warning messages
      *
      * If set to NULL the main window of the currently active document is used.
      */
    Gtk::Window *parent_window;

    void copy_doc(Inkscape::XML::Node * olddoc, Inkscape::XML::Node * newdoc);
    void checkStderr (Glib::ustring const& filename, Gtk::MessageType type, Glib::ustring const& message);

    class file_listener {
        Glib::ustring _string;
        sigc::connection _conn;
        Glib::RefPtr<Glib::IOChannel> _channel;
        Glib::RefPtr<Glib::MainLoop> _main_loop;
        bool _dead;

    public:
        file_listener () : _dead(false) { };
        virtual ~file_listener () {
            _conn.disconnect();
        };

        bool isDead () { return _dead; }
        void init(int fd, Glib::RefPtr<Glib::MainLoop> main);
        bool read(Glib::IOCondition condition);
        Glib::ustring string () { return _string; };
        bool toFile(const Glib::ustring &name);
        bool toFile(const std::string &name);
    };

    int execute (const std::list<std::string> &in_command,
                 const std::list<std::string> &in_params,
                 const Glib::ustring &filein,
                 file_listener &fileout);

    void pump_events();

    /** \brief  A definition of an interpreter, which can be specified
        in the INX file, but we need to know what to call */
    struct interpreter_t {
	std::string              prefstring;   /**< The preferences key that can override the default */
	std::vector<std::string> defaultvals;  /**< The default values to check if the preferences are wrong */
    };
    static const std::map<std::string, interpreter_t> interpreterTab;

    std::string resolveInterpreterExecutable(const Glib::ustring &interpNameArg);

}; // class Script
}  // namespace Implementation
}  // namespace Extension
}  // namespace Inkscape

#endif // INKSCAPE_EXTENSION_IMPEMENTATION_SCRIPT_H_SEEN

/*
  Local Variables:
  mode:c++
  c-file-style:"stroustrup"
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
  indent-tabs-mode:nil
  fill-column:99
  End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :