File indexing completed on 2024-05-19 04:03:03

0001 /*
0002     This file is a part of kipi-plugins project
0003     http://www.kipi-plugins.org
0004 
0005     Date        : 2005-07-07
0006     Description : a tool to export images to imgur.com
0007 
0008     SPDX-FileCopyrightText: 2005-2008 Vardhman Jain <vardhman at gmail dot com>
0009     SPDX-FileCopyrightText: 2008-2013 Gilles Caulier <caulier dot gilles at gmail dot com>
0010     SPDX-FileCopyrightText: 2010-2012 Marius Orcsik <marius at habarnam dot ro>
0011 
0012     SPDX-License-Identifier: GPL-2.0-or-later
0013 */
0014 
0015 #include "mpform.h"
0016 
0017 // Qt includes
0018 
0019 #include <QDebug>
0020 #include <QFile>
0021 #include <QMimeDatabase>
0022 
0023 // KDE includes
0024 
0025 #include <KRandom>
0026 
0027 MPForm::MPForm()
0028 {
0029     m_boundary = "----------";
0030     m_boundary += KRandom::randomString(42 + 13).toLatin1();
0031 }
0032 
0033 MPForm::~MPForm()
0034 {
0035 }
0036 
0037 void MPForm::reset()
0038 {
0039     m_buffer.resize(0);
0040 }
0041 
0042 void MPForm::finish()
0043 {
0044     QByteArray str;
0045     str += "--";
0046     str += m_boundary;
0047     str += "--";
0048     m_buffer.append(str);
0049 }
0050 
0051 bool MPForm::addPair(const QString &name, const QString &value, const QString &contentType)
0052 {
0053     QByteArray str;
0054     QByteArray content_length = QByteArray::number(value.length());
0055 
0056     str += "--";
0057     str += m_boundary;
0058     str += "\r\n";
0059 
0060     if (!name.isEmpty()) {
0061         str += "Content-Disposition: form-data; name=\"";
0062         str += name.toLatin1();
0063         str += "\"\r\n";
0064     }
0065 
0066     if (!contentType.isEmpty()) {
0067         str += "Content-Type: " + contentType.toLatin1();
0068         str += "\r\n";
0069         str += "Mime-version: 1.0 ";
0070         str += "\r\n";
0071     }
0072 
0073     str += "Content-Length: ";
0074     str += content_length;
0075     str += "\r\n\r\n";
0076     str += value.toUtf8();
0077 
0078     m_buffer.append(str);
0079     m_buffer.append("\r\n");
0080 
0081     return true;
0082 }
0083 
0084 bool MPForm::addFile(const QString &name, const QString &path)
0085 {
0086     QMimeDatabase db;
0087     QMimeType ptr = db.mimeTypeForUrl(QUrl::fromLocalFile(path));
0088     QString mime = ptr.name();
0089 
0090     if (mime.isEmpty()) {
0091         // if we ourselves can't determine the mime of the local file,
0092         // very unlikely the remote site will be able to identify it
0093         return false;
0094     }
0095 
0096     QFile imageFile(path);
0097 
0098     if (!imageFile.open(QIODevice::ReadOnly)) {
0099         qWarning() << "Couldn't open" << path;
0100         return false;
0101     }
0102 
0103     QByteArray imageData = imageFile.readAll();
0104 
0105     QByteArray str;
0106     QByteArray file_size = QByteArray::number(imageFile.size());
0107     imageFile.close();
0108 
0109     str += "--";
0110     str += m_boundary;
0111     str += "\r\n";
0112     str += "Content-Disposition: form-data; name=\"";
0113     str += name.toLatin1();
0114     str += "\"; ";
0115     str += "filename=\"";
0116     str += QFile::encodeName(imageFile.fileName());
0117     str += "\"\r\n";
0118     str += "Content-Length: ";
0119     str += file_size;
0120     str += "\r\n";
0121     str += "Content-Type: ";
0122     str += mime.toLatin1();
0123     str += "\r\n\r\n";
0124 
0125     m_buffer.append(str);
0126     // int oldSize = m_buffer.size();
0127     m_buffer.append(imageData);
0128     m_buffer.append("\r\n");
0129 
0130     return true;
0131 }
0132 
0133 bool MPForm::addFile(const QString &name, const QUrl &fileUrl, const QByteArray &fileData)
0134 {
0135     QMimeDatabase db;
0136     QMimeType ptr = db.mimeTypeForUrl(fileUrl);
0137     QString mime = ptr.name();
0138 
0139     if (mime.isEmpty()) {
0140         // if we ourselves can't determine the mime of the local file,
0141         // very unlikely the remote site will be able to identify it
0142         return false;
0143     }
0144 
0145     QByteArray str;
0146     QByteArray file_size = QByteArray::number(fileData.size());
0147 
0148     str += "--";
0149     str += m_boundary;
0150     str += "\r\n";
0151     str += "Content-Disposition: form-data; name=\"";
0152     str += name.toLatin1();
0153     str += "\"; ";
0154     str += "filename=\"";
0155     str += QFile::encodeName(fileUrl.fileName());
0156     str += "\"\r\n";
0157     str += "Content-Length: ";
0158     str += file_size;
0159     str += "\r\n";
0160     str += "Content-Type: ";
0161     str += mime.toLatin1();
0162     str += "\r\n\r\n";
0163 
0164     m_buffer.append(str);
0165     // int oldSize = m_buffer.size();
0166     m_buffer.append(fileData);
0167     m_buffer.append("\r\n");
0168 
0169     return true;
0170 }
0171 
0172 QByteArray MPForm::contentType() const
0173 {
0174     return "Content-Type: multipart/form-data; boundary=" + m_boundary;
0175 }
0176 
0177 QByteArray MPForm::boundary() const
0178 {
0179     return m_boundary;
0180 }
0181 
0182 QByteArray MPForm::formData() const
0183 {
0184     return m_buffer;
0185 }