M android/app/src/main/cpp/chiaki-jni.c => android/app/src/main/cpp/chiaki-jni.c +2 -2
@@ 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)
M android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt => android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt +2 -5
@@ 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
M android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt => android/app/src/main/java/com/metallic/chiaki/stream/StreamActivity.kt +26 -21
@@ 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()
}
}
M gui/src/streamwindow.cpp => gui/src/streamwindow.cpp +1 -1
@@ 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())
M lib/include/chiaki/session.h => lib/include/chiaki/session.h +7 -1
@@ 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;
M lib/src/session.c => lib/src/session.c +6 -1
@@ 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)