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