1 //========================================================================
2 //
3 // FileDescriptorPDFDocBuilder.cc
4 //
5 // This file is licensed under the GPLv2 or later
6 //
7 // Copyright 2010 Hib Eris <hib@hiberis.nl>
8 // Copyright 2010, 2017, 2021 Albert Astals Cid <aacid@kde.org>
9 // Copyright 2021 Oliver Sander <oliver.sander@tu-dresden.de>
10 // Copyright 2021 Christian Persch <chpe@src.gnome.org>
11 //
12 //========================================================================
13
14 #include <config.h>
15
16 #include <cstdio>
17
18 #include "FDPDFDocBuilder.h"
19 #include "FILECacheLoader.h"
20 #include "CachedFile.h"
21
22 //------------------------------------------------------------------------
23 // FileDescriptorPDFDocBuilder
24 //------------------------------------------------------------------------
25
parseFdFromUri(const GooString & uri)26 int FileDescriptorPDFDocBuilder::parseFdFromUri(const GooString &uri)
27 {
28 int fd = -1;
29 char c;
30 if (sscanf(uri.c_str(), "fd://%d%c", &fd, &c) != 1)
31 return -1;
32
33 return fd;
34 }
35
buildPDFDoc(const GooString & uri,GooString * ownerPassword,GooString * userPassword,void * guiDataA)36 std::unique_ptr<PDFDoc> FileDescriptorPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA)
37 {
38 const auto fd = parseFdFromUri(uri);
39 if (fd == -1)
40 return {};
41
42 FILE *file;
43 if (fd == fileno(stdin))
44 file = stdin;
45 else
46 file = fdopen(fd, "rb");
47 if (!file)
48 return {};
49
50 CachedFile *cachedFile = new CachedFile(new FILECacheLoader(file), nullptr);
51 return std::make_unique<PDFDoc>(new CachedFileStream(cachedFile, 0, false, cachedFile->getLength(), Object(objNull)), ownerPassword, userPassword);
52 }
53
supports(const GooString & uri)54 bool FileDescriptorPDFDocBuilder::supports(const GooString &uri)
55 {
56 return parseFdFromUri(uri) != -1;
57 }
58