source: wkhtmltox/trunk/fuentes/src/pdf/wkhtmltopdf.cc @ 51

Last change on this file since 51 was 51, checked in by mabarracus, 4 years ago

wip

File size: 6.1 KB
Line 
1// -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*-
2// vi:set ts=4 sts=4 sw=4 noet :
3//
4// Copyright 2010, 2011 wkhtmltopdf authors
5//
6// This file is part of wkhtmltopdf.
7//
8// wkhtmltopdf is free software: you can redistribute it and/or modify
9// it under the terms of the GNU Lesser General Public License as published by
10// the Free Software Foundation, either version 3 of the License, or
11// (at your option) any later version.
12//
13// wkhtmltopdf is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU Lesser General Public License
19// along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
20
21#include "pdfcommandlineparser.hh"
22#include "progressfeedback.hh"
23#include <QCommonStyle>
24#include <QPainter>
25#include <QStyleOption>
26#include <QWebFrame>
27#include <QtPlugin>
28#include <cstdlib>
29#include <iostream>
30#include <qapplication.h>
31#include <qglobal.h>
32#include <string.h>
33#include <wkhtmltox/pdfconverter.hh>
34#include <wkhtmltox/pdfsettings.hh>
35#include <wkhtmltox/utilities.hh>
36
37#if defined(Q_OS_UNIX)
38#include <locale.h>
39#endif
40
41using namespace wkhtmltopdf::settings;
42using namespace wkhtmltopdf;
43
44/*!
45 * State mashine driven, shell like parser. This is used for
46 * reading commandline options from stdin
47 * \param buff the line to parse
48 * \param nargc on return will hold the number of arguments read
49 * \param nargv on return will hold the arguments read and be NULL terminated
50 */
51enum State {skip, tok, q1, q2, q1_esc, q2_esc, tok_esc};
52void parseString(char * buff, int &nargc, char **nargv) {
53        State state = skip;
54        int write_start=0;
55        int write=0;
56        for (int read=0; buff[read]!='\0'; ++read) {
57                State next_state=state;
58                switch (state) {
59                case skip:
60                        //Whitespace skipping state
61                        if (buff[read]!=' ' && buff[read]!='\t' && buff[read]!='\r' && buff[read]!='\n') {
62                                --read;
63                                next_state=tok;
64                        }
65                        break;
66                case tok:
67                        //Normal toking reading state
68                        if (buff[read]=='\'') next_state=q1;
69                        else if (buff[read]=='"') next_state=q2;
70                        else if (buff[read]=='\\') next_state=tok_esc;
71                        else if (buff[read]==' ' || buff[read]=='\t' || buff[read]=='\n' || buff[read]=='\r') {
72                                next_state=skip;
73                                if (write_start != write) {
74                                        buff[write++]='\0';
75                                        nargv[nargc++] = buff+write_start;
76                                        if (nargc > 998) exit(1);
77                                }
78                                write_start = write;
79                        } else buff[write++] = buff[read];
80                        break;
81                case q1:
82                        //State parsing a single qoute argument
83                        if (buff[read]=='\'') next_state=tok;
84                        else if (buff[read]=='\\') next_state=q1_esc;
85                        else buff[write++] = buff[read];
86                        break;
87                case q2:
88                        //State parsing a double qoute argument
89                        if (buff[read]=='"') next_state=tok;
90                        else if (buff[read]=='\\') next_state=q2_esc;
91                        else buff[write++] = buff[read];
92                        break;
93                case tok_esc:
94                        //Escape one char and return to the token parsing state
95                        next_state=tok;
96                        buff[write++] = buff[read];
97                        break;
98                case q1_esc:
99                        //Espace one char and return to the single quote parsing state
100                        next_state=q1;
101                        buff[write++] = buff[read];
102                        break;
103                case q2_esc:
104                        //Escape one char and return to the double qoute parsing state
105                        next_state=q2;
106                        buff[write++] = buff[read];
107                        break;
108                }
109                state=next_state;
110        }
111        //Remember the last parameter
112        if (write_start != write) {
113                buff[write++]='\0';
114                nargv[nargc++] = buff+write_start;
115        }
116        nargv[nargc]=NULL;
117}
118
119int main(int argc, char * argv[]) {
120#if defined(Q_OS_UNIX)
121        setlocale(LC_ALL, "");
122#endif
123        //This will store all our settings
124        PdfGlobal globalSettings;
125        QList<PdfObject> objectSettings;
126        //Create a command line parser to parse commandline arguments
127        PdfCommandLineParser parser(globalSettings, objectSettings);
128
129        //Setup default values in settings
130        //parser.loadDefaults();
131
132        //Parse the arguments
133        parser.parseArguments(argc, (const char**)argv);
134
135        //Construct QApplication required for printing
136        bool use_graphics=true;
137#if defined(Q_OS_UNIX) || defined(Q_OS_MAC)
138#ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
139        use_graphics=globalSettings.useGraphics;
140        if (!use_graphics) QApplication::setGraphicsSystem("raster");
141#endif
142#endif
143        QApplication a(argc, argv, use_graphics);
144        MyLooksStyle * style = new MyLooksStyle();
145        a.setStyle(style);
146
147        if (parser.readArgsFromStdin) {
148                char buff[20400];
149                char *nargv[1000];
150                nargv[0] = argv[0];
151                for (int i=0; i < argc; ++i) nargv[i] = argv[i];
152                while (fgets(buff,20398,stdin)) {
153                        int nargc=argc;
154                        parseString(buff,nargc,nargv);
155
156                        PdfGlobal globalSettings;
157                        QList<PdfObject> objectSettings;
158                        //Create a command line parser to parse commandline arguments
159                        PdfCommandLineParser parser(globalSettings, objectSettings);
160                        //Setup default values in settings
161                        //parser.loadDefaults();
162                        //Parse the arguments
163                        parser.parseArguments(nargc, (const char**)nargv, true);
164
165                        PdfConverter converter(globalSettings);
166                        ProgressFeedback feedback(globalSettings.quiet, converter);
167                        foreach (const PdfObject & object, objectSettings)
168                                converter.addResource(object);
169
170                        if (!converter.convert())
171                                exit(EXIT_FAILURE);
172                }
173                exit(EXIT_SUCCESS);
174        }
175        //Create the actual page converter to convert the pages
176        PdfConverter converter(globalSettings);
177        QObject::connect(&converter, SIGNAL(producingForms(bool)), style, SLOT(producingForms(bool)));
178        QObject::connect(&converter, SIGNAL(checkboxSvgChanged(const QString &)), style, SLOT(setCheckboxSvg(const QString &)));
179        QObject::connect(&converter, SIGNAL(checkboxCheckedSvgChanged(const QString &)), style, SLOT(setCheckboxCheckedSvg(const QString &)));
180        QObject::connect(&converter, SIGNAL(radiobuttonSvgChanged(const QString &)), style, SLOT(setRadioButtonSvg(const QString &)));
181        QObject::connect(&converter, SIGNAL(radiobuttonCheckedSvgChanged(const QString &)), style, SLOT(setRadioButtonCheckedSvg(const QString &)));
182
183        ProgressFeedback feedback(globalSettings.quiet, converter);
184        foreach (const PdfObject & object, objectSettings)
185                converter.addResource(object);
186
187        bool success = converter.convert();
188        return handleError(success, converter.httpErrorCode());
189}
Note: See TracBrowser for help on using the repository browser.