/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.backup.encryption; import android.app.backup.BackupTransport; import java.io.IOException; import java.io.InputStream; /** Accepts the full backup data stream and sends it to the server. */ public interface FullBackupDataProcessor { /** * Prepares the upload. * *

After this, call {@link #start()} to establish the connection. * * @param inputStream to read the backup data from, calling {@link #finish} or {@link #cancel} * will close the stream * @return {@code true} if the connection was set up successfully, otherwise {@code false} */ boolean initiate(InputStream inputStream) throws IOException; /** * Starts the upload, establishing the connection to the server. * *

After this, call {@link #pushData(int)} to request that the processor reads data from the * socket, and uploads it to the server. * *

After this you must call one of {@link #cancel()}, {@link #finish()}, {@link * #handleCheckSizeRejectionZeroBytes()}, {@link #handleCheckSizeRejectionQuotaExceeded()} or * {@link #handleSendBytesQuotaExceeded()} to close the upload. */ void start(); /** * Requests that the processor read {@code numBytes} from the input stream passed in {@link * #initiate(InputStream)} and upload them to the server. * * @return {@link BackupTransport#TRANSPORT_OK} if the upload succeeds, or {@link * BackupTransport#TRANSPORT_QUOTA_EXCEEDED} if the upload exceeded the server-side app size * quota, or {@link BackupTransport#TRANSPORT_PACKAGE_REJECTED} for other errors. */ int pushData(int numBytes); /** Cancels the upload and tears down the connection. */ void cancel(); /** * Finish the upload and tear down the connection. * *

Call this after there is no more data to push with {@link #pushData(int)}. * * @return One of {@link BackupTransport#TRANSPORT_OK} if the app upload succeeds, {@link * BackupTransport#TRANSPORT_QUOTA_EXCEEDED} if the upload exceeded the server-side app size * quota, {@link BackupTransport#TRANSPORT_ERROR} for server 500s, or {@link * BackupTransport#TRANSPORT_PACKAGE_REJECTED} for other errors. */ int finish(); /** * Notifies the processor that the current upload should be terminated because the estimated * size is zero. */ void handleCheckSizeRejectionZeroBytes(); /** * Notifies the processor that the current upload should be terminated because the estimated * size exceeds the quota. */ void handleCheckSizeRejectionQuotaExceeded(); /** * Notifies this class that the current upload should be terminated because the quota was * exceeded during upload. */ void handleSendBytesQuotaExceeded(); /** * Attaches {@link FullBackupCallbacks} which the processor will notify when the backup * succeeds. */ void attachCallbacks(FullBackupCallbacks fullBackupCallbacks); /** * Implemented by the caller of the processor to receive notification of when the backup * succeeds. */ interface FullBackupCallbacks { /** The processor calls this to indicate that the current backup has succeeded. */ void onSuccess(); /** The processor calls this if the upload failed for a non-transient reason. */ void onTransferFailed(); } }