Browse Source

Restore stdin and stdout functionality

Jakob Truelsen 16 years ago
parent
commit
90708bc6a9
6 changed files with 56 additions and 50 deletions
  1. 18 18
      src/multipageloader.cc
  2. 3 1
      src/multipageloader.hh
  3. 5 4
      src/multipageloader_p.hh
  4. 28 25
      src/pageconverter.cc
  5. 1 1
      src/pageconverter_p.hh
  6. 1 1
      src/tempfile.cc

+ 18 - 18
src/multipageloader.cc

@@ -64,12 +64,13 @@ void MultiPageLoaderPrivate::authenticationRequired(QNetworkReply *reply, QAuthe
  * \param src The source to copy from
  * \param dst The destination to copy to
  */
-void MultiPageLoaderPrivate::copyFile(QFile & src, QFile & dst) {
+bool MultiPageLoader::copyFile(QFile & src, QFile & dst) {
 	QByteArray buf(1024*1024*5,0);
-	while(qint64 r=src.read(buf.data(),buf.size()))
-		dst.write(buf.data(),r);
+	while (qint64 r=src.read(buf.data(),buf.size()))
+		if (dst.write(buf.data(),r) != r) return false;
 	src.close();
 	dst.close();
+	return true;
 }
 
 /*!
@@ -151,20 +152,7 @@ void MultiPageLoaderPrivate::load() {
 		for(QHash<QString, QString>::const_iterator j = settings.customHeaders.constBegin(); j != settings.customHeaders.constEnd(); ++j)
 			r.setRawHeader(j.key().toAscii(), j.value().toAscii());
 		pages[i]->mainFrame()->load(r);
-	}
-
-// 		if (url == "-") {
-// 			QFile in;
-// 			in.open(stdin,QIODevice::ReadOnly);
-// 			url = QDir::tempPath()+"/wktemp"+QUuid::createUuid().toString()+".html";
-// 			temporaryFiles.push_back(url);
-// 			QFile tmp(url);
-// 			tmp.open(QIODevice::WriteOnly);
-// 			copyFile(in,tmp);
-// 		}
-
-// 		page->mainFrame()->load(guessUrlFromString(url));
-	
+	}	
 }
 
 void MultiPageLoaderPrivate::clearResources() {
@@ -172,6 +160,7 @@ void MultiPageLoaderPrivate::clearResources() {
 	urls.clear();
 	progressList.clear();
 	finishedList.clear();
+	tempIn.remove();
 }
 
 void MultiPageLoaderPrivate::cancel() {
@@ -243,7 +232,18 @@ MultiPageLoader::~MultiPageLoader() {
   @param string Url describing the resource to load
 */
 QWebPage * MultiPageLoader::addResource(const QString & string) {
-	return addResource(guessUrlFromString(string));
+	QString url=string;
+	if (url == "-") {
+		QFile in;
+		in.open(stdin,QIODevice::ReadOnly);
+		url = d->tempIn.create(".html");
+		QFile tmp(url);
+		if(!tmp.open(QIODevice::WriteOnly) || !copyFile(in, tmp)) {
+			emit error("Unable to create temporery file");
+			return NULL;
+		}
+	}
+	return addResource(guessUrlFromString(url));
 }
 
 /*!

+ 3 - 1
src/multipageloader.hh

@@ -16,9 +16,10 @@
 #ifndef __MULTIPAGELOADER_HH__
 #define __MULTIPAGELOADER_HH__
 #include "settings.hh"
+#include <QFile>
+#include <QObject>
 #include <QUrl>
 #include <QWebPage>
-#include <QObject>
 
 class MultiPageLoaderPrivate;
 class MultiPageLoader: public QObject {
@@ -30,6 +31,7 @@ public:
 	QWebPage * addResource(const QUrl & url);
 	static QUrl guessUrlFromString(const QString &string);
 	int httpErrorCode();
+	static bool copyFile(QFile & src, QFile & dst);
 public slots:
 	void load();
 	void clearResources();

+ 5 - 4
src/multipageloader_p.hh

@@ -14,12 +14,13 @@
 // You should have received a copy of the GNU General Public License
 // along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
 #include "multipageloader.hh"
-#include <QNetworkAccessManager>
-#include <QWebFrame>
+#include "tempfile.hh"
 #include <QAtomicInt>
-#include <QNetworkReply>
 #include <QAuthenticator>
 #include <QFile>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QWebFrame>
 
 class MultiPageLoaderPrivate: public QObject {
 	Q_OBJECT
@@ -43,6 +44,7 @@ public:
 	bool loadStartedEmitted;
 	bool error;
 	int loadingPages;
+	TempFile tempIn;
 
 	MultiPageLoaderPrivate(Settings & s, MultiPageLoader & o);
 	~MultiPageLoaderPrivate(); 
@@ -50,7 +52,6 @@ public:
 	void load();
 	void clearResources();
 	void cancel();
-	static void copyFile(QFile & src, QFile & dst);
 
 public slots:
 	void loadStarted();

+ 28 - 25
src/pageconverter.cc

@@ -14,16 +14,17 @@
 // You should have received a copy of the GNU General Public License
 // along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
 #include "pageconverter_p.hh"
-#include <qfileinfo.h>
 #include <QAuthenticator>
+#include <QDir>
+#include <QFile>
+#include <QPair>
 #include <QTimer>
-#include <QWebSettings>
-#include <QWebPage>
 #include <QWebFrame>
-#include <QDir>
+#include <QWebPage>
+#include <QWebSettings>
 #include <qapplication.h>
-#include <QPair>
-
+#include <qfileinfo.h>
+ 
 /*!
   \file pageconverter.hh
   \brief Defines the PageConverter class
@@ -110,7 +111,6 @@ void PageConverterPrivate::fail() {
 	emit outer.finished(false);
 }
 
-
 /*!
  * Prepares printing out the document to the pdf file
  */
@@ -120,16 +120,16 @@ void PageConverterPrivate::preparePrint(bool ok) {
 		return;
 	}
 
-	printer = new QPrinter(settings.resolution);
-	
-	QString lout = settings.out;
-	if (settings.dpi != -1) printer->setResolution(settings.dpi);
+	lout = settings.out;
 	if (settings.out == "-") {
-		if (QFile::exists("/dev/stdout"))
-			lout = "/dev/stdout";
-		else
-			lout = tempOut.create(".pdf");
+		 if (QFile::exists("/dev/stdout"))
+ 			lout = "/dev/stdout";
+		 else
+			 lout = tempOut.create(".pdf");
 	}
+
+	printer = new QPrinter(settings.resolution);
+	if (settings.dpi != -1) printer->setResolution(settings.dpi);
 	//Tell the printer object to print the file <out>
 	printer->setOutputFormat(
 		settings.out.endsWith(".ps", Qt::CaseInsensitive)?
@@ -453,21 +453,24 @@ void PageConverterPrivate::printPage(bool ok) {
 		}
  	}
 	outline->printOutline(printer);
-	
  	painter->end();
+
+	if (settings.out == "-" && lout != "/dev/stdout") {
+		QFile i(lout);
+		QFile o;
+		if( !i.open(QIODevice::ReadOnly) || 
+			!o.open(stdout,QIODevice::WriteOnly) ||
+			!MultiPageLoader::copyFile(i,o) ) {
+			emit outer.error("Count not write to stdout");
+			fail();
+			return;
+		}
+	}
+	clearResources();
 	currentPhase = 5;
 	emit outer.phaseChanged();
 	convertionDone = true;
 	emit outer.finished(true);
-
-// 	if (!strcmp(out,"-") && lout != "/dev/stdout") {
-// 		QFile i(lout);
-// 		QFile o;
-// 		i.open(QIODevice::ReadOnly);
-// 		o.open(stdout,QIODevice::WriteOnly);
-// 		copyFile(i,o);
-// 	}
-// 	for (int i=0; i < temp.size(); ++i) QFile::remove(temp[i]);
 }
 
 

+ 1 - 1
src/pageconverter_p.hh

@@ -55,7 +55,7 @@ private:
 	QPainter * painter;
 	Outline * outline;
 	TocPrinter * tocPrinter;
-
+	QString lout;
 	int logicalPages;
 	int logicalPage;
 	int actualPages;

+ 1 - 1
src/tempfile.cc

@@ -41,7 +41,7 @@ TempFile::~TempFile() {
 */
 QString TempFile::create(const QString & ext) {
 	remove();
-	path = QDir::tempPath()+"/wktemp"+QUuid::createUuid().toString()+ext;
+	path = QDir::tempPath()+"/wktemp-"+QUuid::createUuid().toString().mid(1,36)+ext;
 	return path;
 }