Группа :: Сети/WWW
Пакет: cutycapt
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: CutyCapt-0.0-alt3.patch
Скачать
Скачать
CookieJar.cpp | 69 +++++++++++++++++++++++++++++++++++++++++
CookieJar.hpp | 13 ++++++++
CutyCapt.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
CutyCapt.hpp | 21 +++++++++----
CutyCapt.pro | 8 ++---
5 files changed, 188 insertions(+), 22 deletions(-)
diff --git a/CookieJar.cpp b/CookieJar.cpp
new file mode 100644
index 0000000..da943cf
--- /dev/null
+++ b/CookieJar.cpp
@@ -0,0 +1,69 @@
+#include "CookieJar.hpp"
+#include <QNetworkCookie>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define MAX_LINE_LENGTH 4096
+
+bool CookieJar::serialize(const QString& path) {
+ FILE* f = fopen(path.toUtf8(), "w");
+ if(f == NULL) {
+ perror("fopen");
+ return false;
+ }
+
+ bool success = true;
+ QList<QNetworkCookie> cookies = allCookies();
+
+ for(QList<QNetworkCookie>::const_iterator itr = cookies.begin(); itr != cookies.end(); itr++) {
+ int ret = fprintf(f, "%s\n", itr->toRawForm().constData());
+
+ if(ret < 0) {
+ perror("fprintf");
+ success = false;
+ }
+ }
+
+ fclose(f);
+ return success;
+}
+
+bool CookieJar::deserialize(const QString& path) {
+ FILE* f = fopen(path.toUtf8(), "r");
+ if(f == NULL) {
+ return true; // cookie jar file didn't exist - do nothing
+ }
+
+ QList<QNetworkCookie> cookies;
+ char line[MAX_LINE_LENGTH + 1];
+
+ while(fgets(line, MAX_LINE_LENGTH, f) != NULL) {
+ QList<QNetworkCookie> tmp = QNetworkCookie::parseCookies(line);
+
+ if(tmp.size() == 0) {
+ continue;
+ }
+
+ if(tmp.size() > 1) {
+ fprintf(stderr, "warning: cookie jar contains multiple cookies on a single line. We are only taking the first.\n");
+ fprintf(stderr, "%s\n", line);
+ }
+
+ cookies.push_back(tmp.first());
+ }
+
+ if(errno != 0) {
+ perror("fgets");
+ }
+
+ setAllCookies(cookies);
+ fclose(f);
+
+ return true;
+}
diff --git a/CookieJar.hpp b/CookieJar.hpp
new file mode 100644
index 0000000..2a255d7
--- /dev/null
+++ b/CookieJar.hpp
@@ -0,0 +1,13 @@
+#ifndef COOKIEJAR_H
+#define COOKIEJAR_H
+
+#include <QNetworkCookieJar>
+#include <QString>
+
+class CookieJar : public QNetworkCookieJar {
+ public:
+ bool serialize(const QString& path);
+ bool deserialize(const QString& path);
+};
+
+#endif
diff --git a/CutyCapt.cpp b/CutyCapt.cpp
index c732cb9..3aa40b3 100755
--- a/CutyCapt.cpp
+++ b/CutyCapt.cpp
@@ -19,12 +19,19 @@
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
-// $Id$
+// $Id: CutyCapt.cpp 10 2013-07-14 21:57:37Z hoehrmann $
//
////////////////////////////////////////////////////////////////////
#include <QApplication>
#include <QtWebKit>
+#include <QNetworkReply>
+#include <QSslError>
+
+#if QT_VERSION >= 0x050000
+#include <QtWebKitWidgets>`
+#endif
+
#include <QtGui>
#include <QSvgGenerator>
@@ -37,6 +44,8 @@
#include <QNetworkRequest>
#include <QNetworkProxy>
#include "CutyCapt.hpp"
+#include <fstream>
+#include "CookieJar.hpp"
#if QT_VERSION >= 0x040600 && 0
#define CUTYCAPT_SCRIPT 1
@@ -159,10 +168,9 @@ CutyPage::setAttribute(QWebSettings::WebAttribute option,
}
// TODO: Consider merging some of main() and CutyCap
-
CutyCapt::CutyCapt(CutyPage* page, const QString& output, int delay, OutputFormat format,
- const QString& scriptProp, const QString& scriptCode, bool insecure,
- bool smooth) {
+ const QString& scriptProp, const QString& scriptCode, const QString& cookieJarPath,bool insecure, bool smooth,
+QPrinter::Orientation orientation, QPrinter::PaperSize paperSize) {
mPage = page;
mOutput = output;
mDelay = delay;
@@ -173,19 +181,39 @@ CutyCapt::CutyCapt(CutyPage* page, const QString& output, int delay, OutputForma
mFormat = format;
mScriptProp = scriptProp;
mScriptCode = scriptCode;
+ mCookieJarPath = cookieJarPath;
mScriptObj = new QObject();
+ mOrientation = orientation;
+ mPaperSize = paperSize;
+ printf("orientation=%d, paper size=%d\n", orientation, paperSize);
// This is not really nice, but some restructuring work is
// needed anyway, so this should not be that bad for now.
mPage->setCutyCapt(this);
}
+CutyCapt::~CutyCapt() {
+ delete mScriptObj;
+}
+
+
+
void
CutyCapt::InitialLayoutCompleted() {
mSawInitialLayout = true;
if (mSawInitialLayout && mSawDocumentComplete)
TryDelayedRender();
+
+ if(!mCookieJarPath.isEmpty()) {
+ CookieJar* cookieJar = static_cast<CookieJar*>(mPage->networkAccessManager()->cookieJar());
+ bool success = cookieJar->serialize(mCookieJarPath);
+
+ if(!success) {
+ fprintf(stderr, "fatal: unable to serialize cookies to cookie jar path\n");
+ exit(1);
+ }
+ }
}
void
@@ -283,7 +311,8 @@ CutyCapt::saveSnapshot() {
case PdfFormat:
case PsFormat: {
QPrinter printer;
- printer.setPageSize(QPrinter::A4);
+ printer.setPageSize(mPaperSize);
+ printer.setOrientation(mOrientation);
printer.setOutputFileName(mOutput);
// TODO: change quality here?
mainFrame->print(&printer);
@@ -360,7 +389,12 @@ CaptHelp(void) {
" --private-browsing=<on|off> Private browsing (default: unknown) \n"
" --auto-load-images=<on|off> Automatic image loading (default: on) \n"
" --js-can-open-windows=<on|off> Script can open windows? (default: unknown) \n"
+ " --orientation=<landscape|portrait> Page orientation (default: portrait) \n"
+ " --page-size=<A3|A4|Letter|Tabloid> Page size (default: A4) \n"
" --js-can-access-clipboard=<on|off> Script clipboard privs (default: unknown)\n"
+ " --cookie-jar=<path> The path to the cookie jar to use when making\n"
+ " requests. Cookies will be read from this file\n"
+ " and saved back to it after the request. \n"
#if QT_VERSION >= 0x040500
" --print-backgrounds=<on|off> Backgrounds in PDF/PS output (default: off) \n"
" --zoom-factor=<float> Page zoom factor (default: no zooming) \n"
@@ -427,6 +461,10 @@ main(int argc, char *argv[]) {
QByteArray body;
QNetworkRequest req;
QNetworkAccessManager manager;
+ QString cookieJarPath = "";
+ CookieJar cookieJar;
+ QPrinter::Orientation orientation = QPrinter::Portrait;
+ QPrinter::PaperSize paperSize = QPrinter::A4;
// Parse command line parameters
for (int ax = 1; ax < argc; ++ax) {
@@ -460,10 +498,10 @@ main(int argc, char *argv[]) {
#if CUTYCAPT_SCRIPT
} else if (strcmp("--debug-print-alerts", s) == 0) {
- page.setPrintAlerts(true);
+ page.setPrintAlerts(true);
continue;
#endif
- }
+ }
value = strchr(s, '=');
@@ -502,7 +540,6 @@ main(int argc, char *argv[]) {
for (int ix = 0; CutyExtMap[ix].id != CutyCapt::OtherFormat; ++ix)
if (argOut.endsWith(CutyExtMap[ix].extension))
format = CutyExtMap[ix].id; //, break;
-
} else if (strncmp("--user-styles", s, nlen) == 0) {
// This option is provided for backwards-compatibility only
argUserStyle = value;
@@ -543,6 +580,43 @@ main(int argc, char *argv[]) {
} else if (strncmp("--links-included-in-focus-chain", s, nlen) == 0) {
page.setAttribute(QWebSettings::LinksIncludedInFocusChain, value);
+ } else if (strncmp("--orientation", s, nlen) == 0) {
+ if (strcasecmp(value, "landscape") == 0) {
+ orientation = QPrinter::Landscape;
+ } else if (strcasecmp(value, "portrait") == 0) {
+ orientation = QPrinter::Portrait;
+ } else {
+ argHelp = 1;
+ break;
+ }
+ } else if (strncmp("--paper-size", s, nlen) == 0) {
+ if (strcasecmp(value, "A4") == 0) {
+ paperSize = QPrinter::A4;
+ } else if (strcasecmp(value, "A3") == 0) {
+ paperSize = QPrinter::A3;
+ } else if (strcasecmp(value, "Letter") == 0) {
+ paperSize = QPrinter::Letter;
+ } else if (strcasecmp(value, "Legal") == 0) {
+ paperSize = QPrinter::Legal;
+ } else if (strcasecmp(value, "Tabloid") == 0) {
+ paperSize = QPrinter::Tabloid;
+ } else {
+ argHelp = 1;
+ break;
+ }
+ }
+ else if (strncmp("--cookie-jar", s, nlen) == 0) {
+ cookieJarPath = value;
+ bool success = cookieJar.deserialize(cookieJarPath);
+
+ if(!success) {
+ fprintf(stderr, "fatal: unable to deserialize cookies from cookie jar path\n");
+ exit(1);
+ }
+
+ manager.setCookieJar(&cookieJar);
+ page.setNetworkAccessManager(&manager);
+
#if QT_VERSION >= 0x040500
} else if (strncmp("--print-backgrounds", s, nlen) == 0) {
page.setAttribute(QWebSettings::PrintElementBackgrounds, value);
@@ -618,7 +692,7 @@ main(int argc, char *argv[]) {
method = QNetworkAccessManager::PostOperation;
else if (strcmp("value", "head") == 0)
method = QNetworkAccessManager::HeadOperation;
- else
+ else
(void)0; // TODO: ...
} else {
@@ -650,8 +724,8 @@ main(int argc, char *argv[]) {
}
}
- CutyCapt main(&page, argOut, argDelay, format, scriptProp, scriptCode,
- !!argInsecure, !!argSmooth);
+ CutyCapt main(&page, argOut, argDelay, format, scriptProp, scriptCode, cookieJarPath,!!argInsecure, !!argSmooth,orientation,paperSize);
+
app.connect(&page,
SIGNAL(loadFinished(bool)),
@@ -715,5 +789,6 @@ main(int argc, char *argv[]) {
else
page.mainFrame()->load(req, method);
- return app.exec();
+ int status = app.exec();
+ return status;
}
diff --git a/CutyCapt.hpp b/CutyCapt.hpp
index 15f3864..73dc075 100755
--- a/CutyCapt.hpp
+++ b/CutyCapt.hpp
@@ -1,3 +1,4 @@
+#include <QPrinter>
#include <QtWebKit>
#if QT_VERSION >= 0x050000
@@ -39,14 +40,19 @@ public:
RenderTreeFormat, PngFormat, JpegFormat, MngFormat, TiffFormat, GifFormat,
BmpFormat, PpmFormat, XbmFormat, XpmFormat, OtherFormat };
- CutyCapt(CutyPage* page,
- const QString& output,
- int delay,
- OutputFormat format,
- const QString& scriptProp,
+CutyCapt(CutyPage* page,
+ const QString& output,
+ int delay,
+ OutputFormat format,
+ const QString& scriptProp,
const QString& scriptCode,
+ const QString& cookieJarPath,
bool insecure,
- bool smooth);
+ bool smooth,
+ QPrinter::Orientation orientation,
+ QPrinter::PaperSize paperSize);
+
+ ~CutyCapt();
private slots:
void DocumentComplete(bool ok);
@@ -70,6 +76,9 @@ protected:
QObject* mScriptObj;
QString mScriptProp;
QString mScriptCode;
+ QString mCookieJarPath;
bool mInsecure;
bool mSmooth;
+ QPrinter::Orientation mOrientation;
+ QPrinter::PaperSize mPaperSize;
};
diff --git a/CutyCapt.pro b/CutyCapt.pro
index 10dda79..1f2b14e 100755
--- a/CutyCapt.pro
+++ b/CutyCapt.pro
@@ -1,14 +1,14 @@
QT += webkit svg network
-SOURCES = CutyCapt.cpp
-HEADERS = CutyCapt.hpp
-CONFIG += qt console
+SOURCES = CutyCapt.cpp CookieJar.cpp
+HEADERS = CutyCapt.hpp CookieJar.hpp
+CONFIG += qt console debug
greaterThan(QT_MAJOR_VERSION, 4): {
QT += webkitwidgets
+ QT += printsupport
}
contains(CONFIG, static): {
QTPLUGIN += qjpeg qgif qsvg qmng qico qtiff
DEFINES += STATIC_PLUGINS
}
-