summaryrefslogtreecommitdiff
path: root/android/source/src/java/org/libreoffice/storage/owncloud/OwnCloudFile.java
blob: 13c3d6c2ba34206a9ba21e2152720bcdcd06a392 (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
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
131
132
133
134
135
136
137
138
139
140
141
142
package org.libreoffice.storage.owncloud;

import java.io.File;
import java.io.FileFilter;
import java.net.URI;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.libreoffice.storage.IFile;

import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.resources.files.ChunkedUploadRemoteFileOperation;
import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation;
import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation;
import com.owncloud.android.lib.resources.files.RemoteFile;
import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation;

/**
 * Implementation of IFile for ownCloud servers.
 */
public class OwnCloudFile implements IFile {

    private OwnCloudProvider provider;
    private RemoteFile file;

    private String name;
    private String parentPath;

    protected OwnCloudFile(OwnCloudProvider provider, RemoteFile file) {
        this.provider = provider;
        this.file = file;

        // get name and parent from path
        File localFile = new File(file.getRemotePath());
        this.name = localFile.getName();
        this.parentPath = localFile.getParent();
    }

    @Override
    public URI getUri() {
        return URI.create(file.getRemotePath());
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public boolean isDirectory() {
        return file.getMimeType().equals("DIR");
    }

    @Override
    public long getSize() {
        return file.getLength();
    }

    @Override
    public Date getLastModified() {
        return new Date(file.getModifiedTimestamp());
    }

    @Override
    public List<IFile> listFiles() {
        List<IFile> children = new ArrayList<IFile>();
        if (isDirectory()) {
            ReadRemoteFolderOperation refreshOperation = new ReadRemoteFolderOperation(
                    file.getRemotePath());
            RemoteOperationResult result = refreshOperation.execute(provider
                    .getClient());
            if (!result.isSuccess()) {
                throw provider.buildRuntimeExceptionForResultCode(result.getCode());
            }
            for (Object obj : result.getData()) {
                RemoteFile child = (RemoteFile) obj;
                if (!child.getRemotePath().equals(file.getRemotePath()))
                    children.add(new OwnCloudFile(provider, child));
            }
        }
        return children;
    }

    @Override
    public List<IFile> listFiles(FileFilter filter) {
        // TODO no filtering yet
        return listFiles();
    }

    @Override
    public IFile getParent() {
        if (parentPath == null)
            // this is the root node
            return null;

        return provider.createFromUri(URI.create(parentPath));
    }

    @Override
    public File getDocument() {
        if (isDirectory()) {
            return null;
        }
        File downFolder = provider.getCacheDir();
        DownloadRemoteFileOperation operation = new DownloadRemoteFileOperation(
                file.getRemotePath(), downFolder.getAbsolutePath());
        RemoteOperationResult result = operation.execute(provider.getClient());
        if (!result.isSuccess()) {
            throw provider.buildRuntimeExceptionForResultCode(result.getCode());
        }
        return new File(downFolder.getAbsolutePath() + file.getRemotePath());
    }

    @Override
    public boolean equals(Object object) {
        if (this == object)
            return true;
        if (!(object instanceof OwnCloudFile))
            return false;
        OwnCloudFile file = (OwnCloudFile) object;
        return file.getUri().equals(getUri());
    }

    @Override
    public void saveDocument(File newFile) {
        UploadRemoteFileOperation uploadOperation;
        if (newFile.length() > ChunkedUploadRemoteFileOperation.CHUNK_SIZE) {
            uploadOperation = new ChunkedUploadRemoteFileOperation(
                    newFile.getPath(), file.getRemotePath(), file.getMimeType());
        } else {
            uploadOperation = new UploadRemoteFileOperation(newFile.getPath(),
                    file.getRemotePath(), file.getMimeType());
        }

        RemoteOperationResult result = uploadOperation.execute(provider
                .getClient());
        if (!result.isSuccess()) {
            throw provider.buildRuntimeExceptionForResultCode(result.getCode());
        }
    }
}