Do not handle server shutdown as error

When the console is powered off or put into sleep mode during streaming,
the remote will disconnect and report the string "Server shutting down".
This is expected by the user and thus should not be shown as an error
message.
This commit is contained in:
Florian Märkl 2023-02-08 14:08:45 +01:00
parent 582ec7aa54
commit 6096de8c13
6 changed files with 44 additions and 31 deletions

View file

@ -110,9 +110,9 @@ JNIEXPORT jstring JNICALL JNI_FCN(quitReasonToString)(JNIEnv *env, jobject obj,
return E->NewStringUTF(env, chiaki_quit_reason_string((ChiakiQuitReason)value));
}
JNIEXPORT jboolean JNICALL JNI_FCN(quitReasonIsStopped)(JNIEnv *env, jobject obj, jint value)
JNIEXPORT jboolean JNICALL JNI_FCN(quitReasonIsError)(JNIEnv *env, jobject obj, jint value)
{
return value == CHIAKI_QUIT_REASON_STOPPED;
return chiaki_quit_reason_is_error(value);
}
JNIEXPORT jobject JNICALL JNI_FCN(videoProfilePreset)(JNIEnv *env, jobject obj, jint resolution_preset, jint fps_preset, jobject codec)

View file

@ -83,7 +83,7 @@ private class ChiakiNative
}
@JvmStatic external fun errorCodeToString(value: Int): String
@JvmStatic external fun quitReasonToString(value: Int): String
@JvmStatic external fun quitReasonIsStopped(value: Int): Boolean
@JvmStatic external fun quitReasonIsError(value: Int): Boolean
@JvmStatic external fun videoProfilePreset(resolutionPreset: Int, fpsPreset: Int, codec: Codec): ConnectVideoProfile
@JvmStatic external fun sessionCreate(result: CreateResult, connectInfo: ConnectInfo, logFile: String?, logVerbose: Boolean, javaSession: Session)
@JvmStatic external fun sessionFree(ptr: Long)
@ -309,10 +309,7 @@ class QuitReason(val value: Int)
{
override fun toString() = ChiakiNative.quitReasonToString(value)
/**
* whether the reason is CHIAKI_QUIT_REASON_STOPPED
*/
val isStopped = ChiakiNative.quitReasonIsStopped(value)
val isError = ChiakiNative.quitReasonIsError(value)
}
sealed class Event

View file

@ -230,28 +230,33 @@ class StreamActivity : AppCompatActivity(), View.OnSystemUiVisibilityChangeListe
{
is StreamStateQuit ->
{
if(!state.reason.isStopped && dialogContents != StreamQuitDialog)
if(dialogContents != StreamQuitDialog)
{
dialog?.dismiss()
val reasonStr = state.reasonString
val dialog = MaterialAlertDialogBuilder(this)
.setMessage(getString(R.string.alert_message_session_quit, state.reason.toString())
+ (if(reasonStr != null) "\n$reasonStr" else ""))
.setPositiveButton(R.string.action_reconnect) { _, _ ->
dialog = null
reconnect()
}
.setOnCancelListener {
dialog = null
finish()
}
.setNegativeButton(R.string.action_quit_session) { _, _ ->
dialog = null
finish()
}
.create()
dialogContents = StreamQuitDialog
dialog.show()
if(state.reason.isError)
{
dialog?.dismiss()
val reasonStr = state.reasonString
val dialog = MaterialAlertDialogBuilder(this)
.setMessage(getString(R.string.alert_message_session_quit, state.reason.toString())
+ (if(reasonStr != null) "\n$reasonStr" else ""))
.setPositiveButton(R.string.action_reconnect) { _, _ ->
dialog = null
reconnect()
}
.setOnCancelListener {
dialog = null
finish()
}
.setNegativeButton(R.string.action_quit_session) { _, _ ->
dialog = null
finish()
}
.create()
dialogContents = StreamQuitDialog
dialog.show()
}
else
finish()
}
}

View file

@ -201,7 +201,7 @@ void StreamWindow::closeEvent(QCloseEvent *event)
void StreamWindow::SessionQuit(ChiakiQuitReason reason, const QString &reason_str)
{
if(reason != CHIAKI_QUIT_REASON_STOPPED)
if(chiaki_quit_reason_is_error(reason))
{
QString m = tr("Chiaki Session has quit") + ":\n" + chiaki_quit_reason_string(reason);
if(!reason_str.isEmpty())

View file

@ -94,11 +94,17 @@ typedef enum {
CHIAKI_QUIT_REASON_CTRL_CONNECT_FAILED,
CHIAKI_QUIT_REASON_CTRL_CONNECTION_REFUSED,
CHIAKI_QUIT_REASON_STREAM_CONNECTION_UNKNOWN,
CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_DISCONNECTED
CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_DISCONNECTED,
CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_SHUTDOWN, // like REMOTE_DISCONNECTED, but because the server shut down
} ChiakiQuitReason;
CHIAKI_EXPORT const char *chiaki_quit_reason_string(ChiakiQuitReason reason);
static inline bool chiaki_quit_reason_is_error(ChiakiQuitReason reason)
{
return reason != CHIAKI_QUIT_REASON_STOPPED && reason != CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_SHUTDOWN;
}
typedef struct chiaki_quit_event_t
{
ChiakiQuitReason reason;

View file

@ -158,6 +158,8 @@ CHIAKI_EXPORT const char *chiaki_quit_reason_string(ChiakiQuitReason reason)
return "Unknown Error in Stream Connection";
case CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_DISCONNECTED:
return "Remote has disconnected from Stream Connection";
case CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_SHUTDOWN:
return "Remote has disconnected from Stream Connection the because Server shut down";
case CHIAKI_QUIT_REASON_NONE:
default:
return "Unknown";
@ -505,7 +507,10 @@ ctrl_failed:
if(err == CHIAKI_ERR_DISCONNECTED)
{
CHIAKI_LOGE(session->log, "Remote disconnected from StreamConnection");
session->quit_reason = CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_DISCONNECTED;
if(!strcmp(session->stream_connection.remote_disconnect_reason, "Server shutting down"))
session->quit_reason = CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_SHUTDOWN;
else
session->quit_reason = CHIAKI_QUIT_REASON_STREAM_CONNECTION_REMOTE_DISCONNECTED;
session->quit_reason_str = strdup(session->stream_connection.remote_disconnect_reason);
}
else if(err != CHIAKI_ERR_SUCCESS && err != CHIAKI_ERR_CANCELED)