Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 5074667a authored by ZetaTom's avatar ZetaTom
Browse files

Implement remote operations for files download limit

parent 43a58e2f
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
/*
 * Nextcloud Android Library
 *
 * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com>
 * SPDX-License-Identifier: MIT
 */

package com.nextcloud.android.lib.resources.files

import java.io.Serializable

data class FileDownloadLimit(
    val token: String,
    val limit: Int,
    val count: Int
) : Serializable
+72 −0
Original line number Diff line number Diff line
/*
 * Nextcloud Android Library
 *
 * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com>
 * SPDX-License-Identifier: MIT
 */

package com.nextcloud.android.lib.resources.files

import com.owncloud.android.lib.common.OwnCloudClient
import com.owncloud.android.lib.common.network.WebdavEntry
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.OCSRemoteOperation
import org.apache.commons.httpclient.HttpStatus
import org.apache.jackrabbit.webdav.DavConstants
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet
import org.apache.jackrabbit.webdav.xml.Namespace

class GetFilesDownloadLimitRemoteOperation
    @JvmOverloads
    constructor(
        val remotePath: String,
        val subfiles: Boolean = false
    ) : OCSRemoteOperation<List<FileDownloadLimit>>() {
        @Deprecated("Deprecated in Java")
        override fun run(client: OwnCloudClient): RemoteOperationResult<List<FileDownloadLimit>> {
            var result: RemoteOperationResult<List<FileDownloadLimit>>
            var propFindMethod: PropFindMethod? = null
            val propSet = DavPropertyNameSet()
            val depth = if (subfiles) DavConstants.DEPTH_1 else DavConstants.DEPTH_0

            propSet.add(
                WebdavEntry.EXTENDED_PROPERTY_FILE_DOWNLOAD_LIMITS,
                Namespace.getNamespace(WebdavEntry.NAMESPACE_NC)
            )

            try {
                propFindMethod = PropFindMethod(client.getFilesDavUri(remotePath), propSet, depth)

                val status = client.executeMethod(propFindMethod)

                if (status == HttpStatus.SC_MULTI_STATUS || status == HttpStatus.SC_OK) {
                    val response = propFindMethod.responseBodyAsMultiStatus

                    val fileDownloadLimits =
                        response.responses.flatMap {
                            val webdavEntry = WebdavEntry(it, client.filesDavUri.encodedPath!!)
                            webdavEntry.fileDownloadLimit
                        }

                    result = RemoteOperationResult(true, propFindMethod)
                    result.resultData = fileDownloadLimits
                } else {
                    result = RemoteOperationResult(false, propFindMethod)
                    client.exhaustResponse(propFindMethod.responseBodyAsStream)
                }
            } catch (e: Exception) {
                result = RemoteOperationResult(e)
                Log_OC.e(TAG, "Exception while reading download limit", e)
            } finally {
                propFindMethod?.releaseConnection()
            }

            return result
        }

        companion object {
            private val TAG = GetFilesDownloadLimitRemoteOperation::class.java.simpleName
        }
    }
+51 −0
Original line number Diff line number Diff line
/*
 * Nextcloud Android Library
 *
 * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com>
 * SPDX-License-Identifier: MIT
 */

package com.nextcloud.android.lib.resources.files

import com.nextcloud.common.NextcloudClient
import com.nextcloud.operations.DeleteMethod
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.OCSRemoteOperation
import org.apache.commons.httpclient.HttpStatus

class RemoveFilesDownloadLimitRemoteOperation(
    val token: String
) : OCSRemoteOperation<Void>() {
    override fun run(client: NextcloudClient): RemoteOperationResult<Void> {
        var result: RemoteOperationResult<Void>
        var deleteMethod: DeleteMethod? = null

        try {
            val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token) + JSON_FORMAT
            deleteMethod = DeleteMethod(url, true)

            val status = deleteMethod.execute(client)

            if (status == HttpStatus.SC_OK) {
                result = RemoteOperationResult(true, deleteMethod)
            } else {
                result = RemoteOperationResult(false, deleteMethod)
                Log_OC.e(TAG, "Failed to remove download limit")
                Log_OC.e(TAG, "*** status code: " + status + "; response: " + deleteMethod.getResponseBodyAsString())
            }
        } catch (e: Exception) {
            result = RemoteOperationResult(e)
            Log_OC.e(TAG, "Exception while removing download limit", e)
        } finally {
            deleteMethod?.releaseConnection()
        }

        return result
    }

    companion object {
        private val TAG = RemoveFilesDownloadLimitRemoteOperation::class.java.simpleName
        private const val FILES_DOWNLOAD_LIMIT_ENDPOINT = "/ocs/v2.php/apps/files_downloadlimit/api/v1/%s/limit"
    }
}
+54 −0
Original line number Diff line number Diff line
/*
 * Nextcloud Android Library
 *
 * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com>
 * SPDX-License-Identifier: MIT
 */

package com.nextcloud.android.lib.resources.files

import com.nextcloud.common.JSONRequestBody
import com.nextcloud.common.NextcloudClient
import com.nextcloud.operations.PutMethod
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.OCSRemoteOperation
import org.apache.commons.httpclient.HttpStatus

class SetFilesDownloadLimitRemoteOperation(
    val token: String,
    val limit: Int
) : OCSRemoteOperation<Void>() {
    override fun run(client: NextcloudClient): RemoteOperationResult<Void> {
        var result: RemoteOperationResult<Void>
        var putMethod: PutMethod? = null

        try {
            val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token)
            val jsonRequestBody = JSONRequestBody("limit", limit.toString())
            putMethod = PutMethod(url, true, jsonRequestBody.get())

            val status = putMethod.execute(client)

            if (status == HttpStatus.SC_OK) {
                result = RemoteOperationResult(true, putMethod)
            } else {
                result = RemoteOperationResult(false, putMethod)
                Log_OC.e(TAG, "Failed to set download limit")
                Log_OC.e(TAG, "*** status code: " + status + "; response: " + putMethod.getResponseBodyAsString())
            }
        } catch (e: Exception) {
            result = RemoteOperationResult(e)
            Log_OC.e(TAG, "Exception while setting download limit", e)
        } finally {
            putMethod?.releaseConnection()
        }

        return result
    }

    companion object {
        private val TAG = SetFilesDownloadLimitRemoteOperation::class.java.simpleName
        private const val FILES_DOWNLOAD_LIMIT_ENDPOINT = "/ocs/v2.php/apps/files_downloadlimit/api/v1/%s/limit"
    }
}