mirror of
https://github.com/peterosterlund2/droidfish.git
synced 2025-12-18 11:42:17 +01:00
DroidFish: Made it possible to configure more than one network engine.
This commit is contained in:
@@ -21,6 +21,8 @@ package org.petero.droidfish;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
@@ -748,7 +750,6 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
|
||||
String engine = settings.getString("engine", "stockfish");
|
||||
int strength = settings.getInt("strength", 1000);
|
||||
engineOptions.networkEngine = settings.getString("networkEngine", "").trim();
|
||||
setEngineStrength(engine, strength);
|
||||
|
||||
mPonderMode = settings.getBoolean("ponderMode", false);
|
||||
@@ -800,7 +801,7 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
gtbPath = extDir.getAbsolutePath() + sep + gtbDefaultDir;
|
||||
}
|
||||
engineOptions.gtbPath = gtbPath;
|
||||
setEngineOptions();
|
||||
setEngineOptions(false);
|
||||
setEgtbHints(cb.getSelectedSquare());
|
||||
|
||||
updateThinkingInfo();
|
||||
@@ -895,8 +896,6 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
int idx = engine.lastIndexOf('/');
|
||||
String eName = engine.substring(idx + 1);
|
||||
engineTitleText.setText(eName);
|
||||
} else if (engine.equals("networkEngine")) {
|
||||
engineTitleText.setText(engineOptions.networkEngine);
|
||||
} else {
|
||||
String eName = getString(engine.equals("cuckoochess") ?
|
||||
R.string.cuckoochess_engine :
|
||||
@@ -939,12 +938,25 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
|
||||
private boolean egtbForceReload = false;
|
||||
|
||||
private final void setEngineOptions() {
|
||||
ctrl.setEngineOptions(new EngineOptions(engineOptions));
|
||||
private final void setEngineOptions(boolean restart) {
|
||||
computeNetEngineID();
|
||||
ctrl.setEngineOptions(new EngineOptions(engineOptions), restart);
|
||||
Probe.getInstance().setPath(engineOptions.gtbPath, egtbForceReload);
|
||||
egtbForceReload = false;
|
||||
}
|
||||
|
||||
private final void computeNetEngineID() {
|
||||
String id = "";
|
||||
try {
|
||||
String engine = settings.getString("engine", "stockfish");
|
||||
String[] lines = Util.readFile(engine);
|
||||
if (lines.length >= 3)
|
||||
id = lines[1] + ":" + lines[2];
|
||||
} catch (IOException e) {
|
||||
}
|
||||
engineOptions.networkID = id;
|
||||
}
|
||||
|
||||
private final void setEgtbHints(int sq) {
|
||||
if (!engineOptions.hints || (sq < 0)) {
|
||||
cb.setSquareDecorations(null);
|
||||
@@ -1027,9 +1039,8 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
removeDialog(SELECT_BOOK_DIALOG);
|
||||
showDialog(SELECT_BOOK_DIALOG);
|
||||
return true;
|
||||
case R.id.select_engine:
|
||||
removeDialog(SELECT_ENGINE_DIALOG);
|
||||
showDialog(SELECT_ENGINE_DIALOG);
|
||||
case R.id.manage_engines:
|
||||
showDialog(MANAGE_ENGINES_DIALOG);
|
||||
return true;
|
||||
case R.id.set_color_theme:
|
||||
showDialog(SET_COLOR_THEME_DIALOG);
|
||||
@@ -1423,6 +1434,10 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
static private final int CUSTOM1_BUTTON_DIALOG = 17;
|
||||
static private final int CUSTOM2_BUTTON_DIALOG = 18;
|
||||
static private final int CUSTOM3_BUTTON_DIALOG = 19;
|
||||
static private final int MANAGE_ENGINES_DIALOG = 20;
|
||||
static private final int NETWORK_ENGINE_DIALOG = 21;
|
||||
static private final int NEW_NETWORK_ENGINE_DIALOG = 22;
|
||||
static private final int NETWORK_ENGINE_CONFIG_DIALOG = 23;
|
||||
|
||||
@Override
|
||||
protected Dialog onCreateDialog(int id) {
|
||||
@@ -1590,8 +1605,6 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
} catch (UnsupportedEncodingException e1) {
|
||||
} catch (IOException e) {
|
||||
}
|
||||
System.out.printf("%.3f DroidFish.onCreateDialog(): data:%s\n",
|
||||
System.currentTimeMillis() * 1e-3, data);
|
||||
wv.loadDataWithBaseURL(null, data, "text/html", "utf-8", null);
|
||||
try {
|
||||
PackageInfo pi = getPackageManager().getPackageInfo("org.petero.droidfish", 0);
|
||||
@@ -1683,11 +1696,15 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
return alert;
|
||||
}
|
||||
case SELECT_ENGINE_DIALOG: {
|
||||
String[] fileNames = findFilesInDirectory(engineDir, null);
|
||||
String[] fileNames = findFilesInDirectory(engineDir, new FileNameFilter() {
|
||||
@Override
|
||||
public boolean accept(String filename) {
|
||||
return !internalEngine(filename);
|
||||
}
|
||||
});
|
||||
final int numFiles = fileNames.length;
|
||||
boolean haveSf = EngineUtil.internalStockFishName() != null;
|
||||
boolean haveNet = engineOptions.networkEngine.length() > 0;
|
||||
final int nEngines = numFiles + 1 + (haveSf ? 1 : 0) + (haveNet ? 1 : 0);
|
||||
final int nEngines = numFiles + 1 + (haveSf ? 1 : 0);
|
||||
final String[] items = new String[nEngines];
|
||||
final String[] ids = new String[nEngines];
|
||||
int idx = 0;
|
||||
@@ -1695,9 +1712,6 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
ids[idx] = "stockfish"; items[idx] = getString(R.string.stockfish_engine); idx++;
|
||||
}
|
||||
ids[idx] = "cuckoochess"; items[idx] = getString(R.string.cuckoochess_engine); idx++;
|
||||
if (haveNet) {
|
||||
ids[idx] = "networkEngine"; items[idx] = getString(R.string.network_engine); idx++;
|
||||
}
|
||||
String sep = File.separator;
|
||||
String base = Environment.getExternalStorageDirectory() + sep + engineDir + sep;
|
||||
for (int i = 0; i < numFiles; i++) {
|
||||
@@ -1725,6 +1739,7 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
editor.commit();
|
||||
dialog.dismiss();
|
||||
int strength = settings.getInt("strength", 1000);
|
||||
setEngineOptions(false);
|
||||
setEngineStrength(engine, strength);
|
||||
}
|
||||
});
|
||||
@@ -2193,10 +2208,229 @@ public class DroidFish extends Activity implements GUIInterface {
|
||||
return makeButtonDialog(custom2ButtonActions);
|
||||
case CUSTOM3_BUTTON_DIALOG:
|
||||
return makeButtonDialog(custom3ButtonActions);
|
||||
case MANAGE_ENGINES_DIALOG:
|
||||
return manageEnginesDialog();
|
||||
case NETWORK_ENGINE_DIALOG:
|
||||
return networkEngineDialog();
|
||||
case NEW_NETWORK_ENGINE_DIALOG:
|
||||
return newNetworkEngineDialog();
|
||||
case NETWORK_ENGINE_CONFIG_DIALOG:
|
||||
return networkEngineConfigDialog();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private final static boolean internalEngine(String name) {
|
||||
return "cuckoochess".equals(name) ||
|
||||
"stockfish".equals(name);
|
||||
}
|
||||
|
||||
private final Dialog manageEnginesDialog() {
|
||||
final CharSequence[] items = {
|
||||
getString(R.string.select_engine),
|
||||
getString(R.string.network_engine)
|
||||
};
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle(R.string.option_manage_engines);
|
||||
builder.setItems(items, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int item) {
|
||||
switch (item) {
|
||||
case 0:
|
||||
removeDialog(SELECT_ENGINE_DIALOG);
|
||||
showDialog(SELECT_ENGINE_DIALOG);
|
||||
break;
|
||||
case 1:
|
||||
removeDialog(NETWORK_ENGINE_DIALOG);
|
||||
showDialog(NETWORK_ENGINE_DIALOG);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
return alert;
|
||||
}
|
||||
|
||||
private final Dialog networkEngineDialog() {
|
||||
String[] fileNames = findFilesInDirectory(engineDir, new FileNameFilter() {
|
||||
@Override
|
||||
public boolean accept(String filename) {
|
||||
if (internalEngine(filename))
|
||||
return false;
|
||||
try {
|
||||
InputStream inStream = new FileInputStream(filename);
|
||||
InputStreamReader inFile = new InputStreamReader(inStream);
|
||||
char[] buf = new char[4];
|
||||
boolean ret = (inFile.read(buf) == 4) && "NETE".equals(new String(buf));
|
||||
inFile.close();
|
||||
return ret;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
final int numFiles = fileNames.length;
|
||||
final int numItems = numFiles + 1;
|
||||
final String[] items = new String[numItems];
|
||||
final String[] ids = new String[numItems];
|
||||
int idx = 0;
|
||||
String sep = File.separator;
|
||||
String base = Environment.getExternalStorageDirectory() + sep + engineDir + sep;
|
||||
for (int i = 0; i < numFiles; i++) {
|
||||
ids[idx] = base + fileNames[i];
|
||||
items[idx] = fileNames[i];
|
||||
idx++;
|
||||
}
|
||||
ids[idx] = ""; items[idx] = getString(R.string.new_engine); idx++;
|
||||
String currEngine = ctrl.getEngine();
|
||||
int defaultItem = 0;
|
||||
for (int i = 0; i < numItems; i++)
|
||||
if (ids[i].equals(currEngine)) {
|
||||
defaultItem = i;
|
||||
break;
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle(R.string.configure_network_engine);
|
||||
builder.setSingleChoiceItems(items, defaultItem, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int item) {
|
||||
if ((item < 0) || (item >= numItems))
|
||||
return;
|
||||
dialog.dismiss();
|
||||
if (item == numItems - 1) {
|
||||
showDialog(NEW_NETWORK_ENGINE_DIALOG);
|
||||
} else {
|
||||
networkEngineToConfig = ids[item];
|
||||
removeDialog(NETWORK_ENGINE_CONFIG_DIALOG);
|
||||
showDialog(NETWORK_ENGINE_CONFIG_DIALOG);
|
||||
}
|
||||
}
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
return alert;
|
||||
}
|
||||
|
||||
// Filename of network engine to configure
|
||||
private String networkEngineToConfig = "";
|
||||
|
||||
// Ask for name of new network engine
|
||||
private final Dialog newNetworkEngineDialog() {
|
||||
View content = View.inflate(this, R.layout.create_network_engine, null);
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setView(content);
|
||||
builder.setTitle(R.string.create_network_engine);
|
||||
final EditText engineNameView = (EditText)content.findViewById(R.id.create_network_engine);
|
||||
engineNameView.setText("");
|
||||
final Runnable createEngine = new Runnable() {
|
||||
public void run() {
|
||||
String engineName = engineNameView.getText().toString();
|
||||
String sep = File.separator;
|
||||
String pathName = Environment.getExternalStorageDirectory() + sep + engineDir + sep + engineName;
|
||||
File file = new File(pathName);
|
||||
if (internalEngine(engineName) || file.exists()) {
|
||||
Toast.makeText(getApplicationContext(), R.string.engine_name_in_use, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
networkEngineToConfig = pathName;
|
||||
removeDialog(NETWORK_ENGINE_CONFIG_DIALOG);
|
||||
showDialog(NETWORK_ENGINE_CONFIG_DIALOG);
|
||||
}
|
||||
};
|
||||
builder.setPositiveButton(android.R.string.ok, new Dialog.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
createEngine.run();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel, null);
|
||||
|
||||
final Dialog dialog = builder.create();
|
||||
engineNameView.setOnKeyListener(new OnKeyListener() {
|
||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
|
||||
createEngine.run();
|
||||
dialog.cancel();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return dialog;
|
||||
}
|
||||
|
||||
// Configure network engine settings
|
||||
private final Dialog networkEngineConfigDialog() {
|
||||
View content = View.inflate(this, R.layout.network_engine_config, null);
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setView(content);
|
||||
builder.setTitle(R.string.configure_network_engine);
|
||||
final EditText hostNameView = (EditText)content.findViewById(R.id.network_engine_host);
|
||||
final EditText portView = (EditText)content.findViewById(R.id.network_engine_port);
|
||||
String hostName = "";
|
||||
String port = "0";
|
||||
try {
|
||||
String[] lines = Util.readFile(networkEngineToConfig);
|
||||
if ((lines.length >= 1) && lines[0].equals("NETE")) {
|
||||
if (lines.length > 1)
|
||||
hostName = lines[1];
|
||||
if (lines.length > 2)
|
||||
port = lines[2];
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
}
|
||||
hostNameView.setText(hostName);
|
||||
portView.setText(port);
|
||||
final Runnable writeConfig = new Runnable() {
|
||||
public void run() {
|
||||
String hostName = hostNameView.getText().toString();
|
||||
String port = portView.getText().toString();
|
||||
try {
|
||||
FileWriter fw = new FileWriter(new File(networkEngineToConfig), false);
|
||||
fw.write("NETE\n");
|
||||
fw.write(hostName); fw.write("\n");
|
||||
fw.write(port); fw.write("\n");
|
||||
fw.close();
|
||||
setEngineOptions(true);
|
||||
} catch (IOException e) {
|
||||
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
};
|
||||
builder.setPositiveButton(android.R.string.ok, new Dialog.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
writeConfig.run();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel, null);
|
||||
builder.setNeutralButton(R.string.delete, new Dialog.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
new File(networkEngineToConfig).delete();
|
||||
String engine = settings.getString("engine", "stockfish");
|
||||
if (engine.equals(networkEngineToConfig)) {
|
||||
engine = "stockfish";
|
||||
Editor editor = settings.edit();
|
||||
editor.putString("engine", engine);
|
||||
editor.commit();
|
||||
dialog.dismiss();
|
||||
int strength = settings.getInt("strength", 1000);
|
||||
setEngineOptions(false);
|
||||
setEngineStrength(engine, strength);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
final Dialog dialog = builder.create();
|
||||
hostNameView.setOnKeyListener(new OnKeyListener() {
|
||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
|
||||
writeConfig.run();
|
||||
dialog.cancel();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return dialog;
|
||||
}
|
||||
|
||||
private final void shareGame() {
|
||||
Intent i = new Intent(Intent.ACTION_SEND);
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
|
||||
|
||||
@@ -26,7 +26,7 @@ public final class EngineOptions {
|
||||
public boolean rootProbe; // Only search optimal moves at root
|
||||
public boolean engineProbe; // Let engine use EGTB
|
||||
public String gtbPath; // GTB directory path
|
||||
public String networkEngine;// Host:port for network engine
|
||||
public String networkID; // host+port network settings
|
||||
|
||||
public EngineOptions() {
|
||||
hashMB = 16;
|
||||
@@ -35,7 +35,7 @@ public final class EngineOptions {
|
||||
rootProbe = false;
|
||||
engineProbe = false;
|
||||
gtbPath = "";
|
||||
networkEngine = "";
|
||||
networkID = "";
|
||||
}
|
||||
|
||||
public EngineOptions(EngineOptions other) {
|
||||
@@ -45,7 +45,7 @@ public final class EngineOptions {
|
||||
rootProbe = other.rootProbe;
|
||||
engineProbe = other.engineProbe;
|
||||
gtbPath = other.gtbPath;
|
||||
networkEngine = other.networkEngine;
|
||||
networkID = other.networkID;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -60,7 +60,7 @@ public final class EngineOptions {
|
||||
(rootProbe == other.rootProbe) &&
|
||||
(engineProbe == other.engineProbe) &&
|
||||
gtbPath.equals(other.gtbPath) &&
|
||||
networkEngine.equals(other.networkEngine));
|
||||
networkID.equals(other.networkID));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
package org.petero.droidfish;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import android.os.Build;
|
||||
|
||||
public final class Util {
|
||||
@@ -18,4 +25,17 @@ public final class Util {
|
||||
boldStop = "</b>";
|
||||
}
|
||||
}
|
||||
|
||||
/** Read a text file. Return string array with one string per line. */
|
||||
public static String[] readFile(String networkEngineToConfig) throws IOException {
|
||||
ArrayList<String> ret = new ArrayList<String>();
|
||||
InputStream inStream = new FileInputStream(networkEngineToConfig);
|
||||
InputStreamReader inFile = new InputStreamReader(inStream);
|
||||
BufferedReader inBuf = new BufferedReader(inFile);
|
||||
String line;
|
||||
while ((line = inBuf.readLine()) != null)
|
||||
ret.add(line);
|
||||
inBuf.close();
|
||||
return ret.toArray(new String[ret.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@ import java.net.UnknownHostException;
|
||||
|
||||
import org.petero.droidfish.EngineOptions;
|
||||
import org.petero.droidfish.R;
|
||||
import org.petero.droidfish.Util;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
/** Engine running on a different computer. */
|
||||
@@ -34,7 +36,8 @@ public class NetworkEngine extends UCIEngineBase {
|
||||
protected final Context context;
|
||||
private final Report report;
|
||||
|
||||
private String networkEngine;
|
||||
private String fileName;
|
||||
private String networkID;
|
||||
private Socket socket;
|
||||
private Thread startupThread;
|
||||
private Thread stdInThread;
|
||||
@@ -45,11 +48,11 @@ public class NetworkEngine extends UCIEngineBase {
|
||||
private boolean isRunning;
|
||||
private boolean isError;
|
||||
|
||||
public NetworkEngine(Context context, String engine, EngineOptions engineOptions,
|
||||
Report report) {
|
||||
public NetworkEngine(Context context, String engine, EngineOptions engineOptions, Report report) {
|
||||
this.context = context;
|
||||
this.report = report;
|
||||
this.networkEngine = engineOptions.networkEngine;
|
||||
fileName = engine;
|
||||
networkID = engineOptions.networkID;
|
||||
startupThread = null;
|
||||
stdInThread = null;
|
||||
guiToEngine = new LocalPipe();
|
||||
@@ -62,14 +65,25 @@ public class NetworkEngine extends UCIEngineBase {
|
||||
/** Create socket connection to remote server. */
|
||||
private final synchronized void connect() {
|
||||
if (socket == null) {
|
||||
int idx = networkEngine.lastIndexOf(':');
|
||||
if (idx < 0) {
|
||||
String host = null;
|
||||
String port = null;
|
||||
boolean fail = false;
|
||||
try {
|
||||
String[] lines = Util.readFile(fileName);
|
||||
if ((lines.length < 3) || !lines[0].equals("NETE")) {
|
||||
fail = true;
|
||||
} else {
|
||||
host = lines[1];
|
||||
port = lines[2];
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
fail = true;
|
||||
}
|
||||
if (fail) {
|
||||
isError = true;
|
||||
report.reportError(context.getString(R.string.network_host_syntax_error));
|
||||
report.reportError(context.getString(R.string.network_engine_config_error));
|
||||
} else {
|
||||
try {
|
||||
String host = networkEngine.substring(0, idx);
|
||||
String port = networkEngine.substring(idx+1);
|
||||
int portNr = Integer.parseInt(port);
|
||||
socket = new Socket(host, portNr);
|
||||
socket.setTcpNoDelay(true);
|
||||
@@ -205,7 +219,7 @@ public class NetworkEngine extends UCIEngineBase {
|
||||
return false;
|
||||
if (!optionsInitialized)
|
||||
return true;
|
||||
if (!networkEngine.equals(engineOptions.networkEngine))
|
||||
if (!networkID.equals(engineOptions.networkID))
|
||||
return false;
|
||||
if (hashMB != engineOptions.hashMB)
|
||||
return false;
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
|
||||
package org.petero.droidfish.engine;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -41,10 +45,22 @@ public abstract class UCIEngineBase implements UCIEngine {
|
||||
return new CuckooChessEngine(report);
|
||||
else if ("stockfish".equals(engine))
|
||||
return new InternalStockFish(context, report);
|
||||
else if ("networkEngine".equals(engine))
|
||||
return new NetworkEngine(context, engine, engineOptions, report);
|
||||
else
|
||||
return new ExternalEngine(context, engine, report);
|
||||
else {
|
||||
boolean netEngine = false;
|
||||
try {
|
||||
InputStream inStream = new FileInputStream(engine);
|
||||
InputStreamReader inFile = new InputStreamReader(inStream);
|
||||
char[] buf = new char[4];
|
||||
if ((inFile.read(buf) == 4) && "NETE".equals(new String(buf)))
|
||||
netEngine = true;
|
||||
inFile.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
if (netEngine)
|
||||
return new NetworkEngine(context, engine, engineOptions, report);
|
||||
else
|
||||
return new ExternalEngine(context, engine, report);
|
||||
}
|
||||
}
|
||||
|
||||
protected UCIEngineBase() {
|
||||
|
||||
@@ -153,11 +153,16 @@ public class DroidChessController {
|
||||
}
|
||||
}
|
||||
|
||||
public final synchronized void setEngineOptions(EngineOptions options) {
|
||||
public final synchronized void setEngineOptions(EngineOptions options, boolean restart) {
|
||||
if (!engineOptions.equals(options)) {
|
||||
engineOptions = options;
|
||||
if (computerPlayer != null)
|
||||
computerPlayer.setEngineOptions(engineOptions);
|
||||
if (restart && (game != null)) {
|
||||
abortSearch();
|
||||
updateComputeThreads();
|
||||
updateGUI();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user