/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.core.thing.binding.firmware;
/**
* The {@link ProgressCallback} is injected into the
* {@link FirmwareUpdateHandler#updateFirmware(Firmware, ProgressCallback)} operation in order to post progress
* information about the firmware update process.
*
* The progress of a firmware update can be defined by a sequence of {@link ProgressStep}s, a percentage progress or
* both.
*
* In order to use a sequence of {@link ProgressStep}s to indicate the update progress, it is necessary to first define
* a sequence using the method {@link ProgressCallback#defineSequence(ProgressStep...)}. To indicate that the next
* progress step is going to be executed the method {@link ProgressCallback#next()} has to be used.
*
* For updates which are based on a percentage progress it is optional to define a sequence of {@link ProgressStep}s and
* to use the {@link ProgressCallback#next()} method. In order to indicate that the percentage progress has changed, the
* method {@link ProgressCallback#update(progress)} has to be used. It allows to update the percentage progress to a
* value between 0 and 100.
*
* @author Thomas Höfer - Initial contribution
* @author Christop Knauf - Added canceled, pending and update
*/
public interface ProgressCallback {
/**
* Callback operation to define the {@link ProgressStep}s for the sequence of the firmware update. So if the
* operation is invoked with the following progress steps
* <ul>
* <li>{@link ProgressStep#DOWNLOADING}</li>
* <li>{@link ProgressStep#TRANSFERRING}</li>
* <li>{@link ProgressStep#UPDATING}</li>
* </ul>
* then this will mean that the firmware update implementation will initially download the firmware, then
* it will transfer the firmware to the actual device and in a final step it will trigger the update.
*
* @param sequence the progress steps describing the sequence of the firmware update process (must not be null
* or empty)
*
* @throws IllegalArgumentException if given sequence is null or empty
*/
void defineSequence(ProgressStep... sequence);
/**
* Callback operation to indicate that the next progress step is going to be executed. Following the example of the
* {@link ProgressCallback#defineSequence(ProgressStep...)} operation then the first invocation of this operation
* will indicate that firmware update handler is going to download the firmware, the second invocation will indicate
* that the handler is going to transfer the firmware to the device and consequently the third invocation will
* indicate that the handler is going to trigger the update. If the update is pending calling next indicates that
* the update is continued.
*
* @throws IllegalStateException if
* <ul>
* <li>update is not pending and there is no further step to be executed</li>
* <li>if no sequence was defined</li>
* </ul>
*/
void next();
/**
* Callback operation to indicate that the firmware update has failed.
*
* @param errorMessageKey the key of the error message to be internationalized (must not be null or empty)
* @param arguments the arguments to be injected into the internationalized error message (can be null)
*
* @throws IllegalArgumentException if given error message key is null or empty
* @throws IllegalStateException if update is already finished
*/
void failed(String errorMessageKey, Object... arguments);
/**
* Callback operation to indicate that the firmware update was successful.
*
* @throws IllegalStateException if update is finished
*/
void success();
/**
* Callback operation to indicate that the firmware update is pending.
*
* @throws IllegalStateException if update is finished
*/
void pending();
/**
* Callback operation to indicate that the firmware update was canceled.
*
* @throws IllegalStateException if update is finished
*/
void canceled();
/**
* Callback operation to update the percentage progress of the firmware update.
* This method can be used to provide detailed progress information additional to the sequence or even without a
* previous defined sequence.
*
* @param progress the progress between 0 and 100
*
* @throws IllegalArgumentException if given progress is < 0 or > 100
* @throws IllegalArgumentException if given progress is smaller than old progress
* @throws IllegalStateException if update is finished
*/
void update(int progress);
}