~phablet-team/qtubuntu-print/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * Copyright (C) 2016 Canonical Ltd
 *
 * This file is part of qtubuntu-print.
 *
 * qtubuntu-print is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * qtubuntu-print is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with qtubuntu-print.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authored-by: Andrew Hayzen <andrew.hayzen@canonical.com>
 */
#include <com/ubuntu/content/hub.h>
#include <com/ubuntu/content/item.h>
#include <com/ubuntu/content/peer.h>
#include <com/ubuntu/content/store.h>
#include <com/ubuntu/content/transfer.h>
#include <com/ubuntu/content/type.h>

#include <QDebug>
#include <QtCore/QDateTime>
#include <QtCore/QDir>
#include <QtCore/QStandardPaths>
#include <QtCore/QTemporaryFile>
#include <QtCore/QUrl>
#include <QtWidgets/QMessageBox>

#include "i18n.h"

#include "qubuntuprintdevice_p.h"
#include "qubuntuprintengine_p.h"

QT_BEGIN_NAMESPACE

QUbuntuPrintEngine::QUbuntuPrintEngine(QPrinter::PrinterMode m)
    : QPdfPrintEngine(*new QUbuntuPrintEnginePrivate(m))
{
    Q_D(QUbuntuPrintEngine);
}

QUbuntuPrintEngine::~QUbuntuPrintEngine()
{

}

QUbuntuPrintEnginePrivate::QUbuntuPrintEnginePrivate(QPrinter::PrinterMode m)
    : QPdfPrintEnginePrivate(m),
    m_output_filename_auto(false)
{
}

QUbuntuPrintEnginePrivate::~QUbuntuPrintEnginePrivate()
{

}

bool QUbuntuPrintEnginePrivate::openPrintDevice()
{
    if (outDevice)
        return false;

    if (outputFileName.isEmpty()) {
        QTemporaryFile *file = new QTemporaryFile();

        if (file->open()) {
            outputFileName = file->fileName();
            m_output_filename_auto = true;

            outDevice = file;
        } else {
            qDebug() << "Failed to open file";
            delete file;
            return false;
        }
    }

    return true;
}

void QUbuntuPrintEnginePrivate::closePrintDevice()
{
    if (m_output_filename_auto) {
        // ensure file is closed and flushed
        if (outDevice) {
            outDevice->close();
        }

        // Transfer via content-hub
        com::ubuntu::content::Hub *hub = com::ubuntu::content::Hub::Client::instance();
        com::ubuntu::content::Peer peer = com::ubuntu::content::Peer{PRINTING_APP_ID};

        QVector<com::ubuntu::content::Item> items;

        // Content-hub needs file:///path not closePrintDevice/path
        QUrl url(outputFileName);
        url.setScheme("file");
        items.append(com::ubuntu::content::Item(url.toString()));

        com::ubuntu::content::Transfer *transfer = hub->create_export_to_peer(peer);

        if (transfer != Q_NULLPTR && transfer->state() != com::ubuntu::content::Transfer::aborted) {
            transfer->charge(items);
        } else {
            qWarning() << "Transfer failed to create, likely cannot find Peer:" << PRINTING_APP_ID;
            QMessageBox::warning(Q_NULLPTR,
                                 __("Printing failed"),
                                 __("Unable to find ubuntu-printing-app, please ensure that it is installed"));
        }

        // If we set the filename, reset it
        m_output_filename_auto = false;
        outputFileName = "";
    }

    QPdfPrintEnginePrivate::closePrintDevice();

    if (outDevice) {
        outDevice->close();

        delete outDevice;
        outDevice = Q_NULLPTR;
    }
}