aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadFileTransferService.java
blob: fb150a92c02086a22eedf27c2e542d4b7d993b04 (plain)
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
package de.thedevstack.conversationsplus.services.filetransfer.httpupload;

import android.util.Pair;

import java.io.FileNotFoundException;
import java.io.InputStream;

import de.thedevstack.android.logcat.Logging;
import de.thedevstack.conversationsplus.entities.Account;
import de.thedevstack.conversationsplus.entities.DownloadableFile;
import de.thedevstack.conversationsplus.entities.Message;
import de.thedevstack.conversationsplus.persistance.FileBackend;
import de.thedevstack.conversationsplus.services.AbstractConnectionManager;
import de.thedevstack.conversationsplus.services.FileTransferService;
import de.thedevstack.conversationsplus.services.filetransfer.AbstractFileTransferService;
import de.thedevstack.conversationsplus.utils.MessageUtil;
import de.thedevstack.conversationsplus.utils.XmppSendUtil;
import de.thedevstack.conversationsplus.xmpp.httpupload.HttpUpload;
import de.thedevstack.conversationsplus.xmpp.httpupload.HttpUploadRequestSlotPacketGenerator;
import de.thedevstack.conversationsplus.xmpp.jid.Jid;
import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;

/**
 *
 */
public class HttpUploadFileTransferService extends AbstractFileTransferService implements FileTransferService {

    public HttpUploadFileTransferService() {
    }

    /**
     * Transfers a file for the corresponding message.
     *
     * @param message the message containing the file to transfer
     * @return <code>true</code> if the file transfer was started successfully, <code>false</code> otherwise
     */
    @Override
    public boolean transferFile(Message message) {
        return this.transferFile(message, false);
    }

    /**
     * Transfers a file for the corresponding message.
     *
     * @param message the message containing the file to transfer
     * @param delay   whether the message is delayed or not
     * @return <code>true</code> if the file transfer was started successfully, <code>false</code> otherwise
     */
    @Override
    public boolean transferFile(Message message, boolean delay) {
        Logging.d("httpupload", "Starting to upload file");
        boolean started = false;
        try {
            final HttpFileTransferEntity entity = new HttpFileTransferEntity(message, delay);
            this.addStatusListenerToEntity(entity);
            entity.startAttempt();
            Account account = message.getConversation().getAccount();
            DownloadableFile file = entity.getFile();
            Pair<InputStream, Integer> inputStreamAndExpectedSize = AbstractConnectionManager.createInputStream(file, true);

            entity.setFileInputStream(inputStreamAndExpectedSize.first);
            file.setExpectedSize(inputStreamAndExpectedSize.second);

            Logging.d("httpupload", "Requesting upload slot for file upload");
            Jid host = account.getXmppConnection().findDiscoItemByFeature(HttpUpload.NAMESPACE);
            IqPacket request = HttpUploadRequestSlotPacketGenerator.generate(host, file.getName(), file.getSize(), file.getMimeType());
            XmppSendUtil.sendIqPacket(account, request, new HttpUploadSlotRequestReceived(entity));
            MessageUtil.markMessage(message, Message.STATUS_UNSEND);

            Logging.d("httpupload", "Upload slot for file upload requested");
            started = true;
        } catch (FileNotFoundException e) {
            Logging.e("httpupload", "Could not find file, exception message: " + e.getMessage());
        }
        return started;
    }

    /**
     * Checks whether a message can be sent using this service or not.
     *
     * @param message the message to be checked
     * @return <code>true</code> if the message can be processed, <code>false</code> otherwise
     */
    @Override
    public boolean accept(Message message) {
        return null != message
                && null != message.getConversation()
                && null != message.getConversation().getAccount()
                && message.getConversation().getAccount().httpUploadAvailable(FileBackend.getFile(message, false).getSize());
    }
}