Ensure native session is disconnected before resource free.

This commit is contained in:
Armin Novak 2017-10-13 13:13:33 +02:00
parent 9b400bfb68
commit f1e8fdeb50

View File

@ -13,6 +13,7 @@ package com.freerdp.freerdpcore.services;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v4.util.LongSparseArray;
import android.util.Log;
import com.freerdp.freerdpcore.application.GlobalApp;
@ -28,6 +29,8 @@ public class LibFreeRDP {
private static EventListener listener;
private static boolean mHasH264 = true;
private static final LongSparseArray<Boolean> mInstanceState = new LongSparseArray<>();
static {
final String h264 = "openh264";
final String[] libraries = {
@ -92,19 +95,46 @@ public class LibFreeRDP {
}
public static void freeInstance(long inst) {
synchronized (mInstanceState) {
if (mInstanceState.get(inst, false)) {
freerdp_disconnect(inst);
}
while(mInstanceState.get(inst)) {
try {
mInstanceState.wait();
} catch (InterruptedException e) {
throw new RuntimeException();
}
}
}
freerdp_free(inst);
}
public static boolean connect(long inst) {
synchronized (mInstanceState) {
if (mInstanceState.get(inst, false)) {
throw new RuntimeException("instance already connected");
}
}
return freerdp_connect(inst);
}
public static boolean disconnect(long inst) {
return freerdp_disconnect(inst);
synchronized (mInstanceState) {
if (mInstanceState.get(inst)) {
return freerdp_disconnect(inst);
}
return true;
}
}
public static boolean cancelConnection(long inst) {
return freerdp_disconnect(inst);
synchronized (mInstanceState) {
if (mInstanceState.get(inst)) {
return freerdp_disconnect(inst);
}
return true;
}
}
private static String addFlag(String name, boolean enabled) {
@ -337,6 +367,10 @@ public class LibFreeRDP {
private static void OnConnectionSuccess(long inst) {
if (listener != null)
listener.OnConnectionSuccess(inst);
synchronized (mInstanceState) {
mInstanceState.append(inst, true);
mInstanceState.notifyAll();
}
}
private static void OnConnectionFailure(long inst) {
@ -352,6 +386,10 @@ public class LibFreeRDP {
private static void OnDisconnecting(long inst) {
if (listener != null)
listener.OnDisconnecting(inst);
synchronized (mInstanceState) {
mInstanceState.remove(inst);
mInstanceState.notifyAll();
}
}
private static void OnDisconnected(long inst) {