From 06ca3369b24da08d07bd94c8aa8aa2f554c7cabf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhonathan=20Corr=C3=AAa?= Date: Tue, 5 Sep 2023 23:25:50 -0300 Subject: [PATCH] feat: change getFile method this commit prepares the server to allow multiple folders selection. The settings activity is not prepared yet (the next commit will change it). --- .../jhonju/ps3netsrv/app/FirstFragment.java | 17 +++++++++--- .../jhonju/ps3netsrv/app/PS3NetService.java | 2 +- .../ps3netsrv/app/SettingsActivity.java | 13 ++++++--- .../jhonju/ps3netsrv/app/SettingsService.java | 13 +++++---- .../com/jhonju/ps3netsrv/server/Context.java | 9 ++++--- .../ps3netsrv/server/PS3NetSrvTask.java | 8 +++--- .../server/commands/FileCommand.java | 27 ++++++++++++++++--- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 11 files changed, 68 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/jhonju/ps3netsrv/app/FirstFragment.java b/app/src/main/java/com/jhonju/ps3netsrv/app/FirstFragment.java index 74ea093..33f5327 100644 --- a/app/src/main/java/com/jhonju/ps3netsrv/app/FirstFragment.java +++ b/app/src/main/java/com/jhonju/ps3netsrv/app/FirstFragment.java @@ -20,7 +20,9 @@ import java.io.InputStream; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.Properties; +import java.util.Set; public class FirstFragment extends Fragment { @@ -77,13 +79,22 @@ public void onClick(View view) { isServerRunning = !isServerRunning; btnStartServer.setText(isServerRunning ? R.string.stop_server : R.string.start_server); - String folderPath = SettingsService.getFolder(); + Set folderPaths = SettingsService.getFolders(); + Set folderPathsAux = new HashSet<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - folderPath = URLDecoder.decode(folderPath, StandardCharsets.UTF_8.displayName()); + for (String folderPath: folderPaths) { + folderPathsAux.add(URLDecoder.decode(folderPath, StandardCharsets.UTF_8.displayName())); + } + } else { + folderPathsAux = folderPaths; } int port = SettingsService.getPort(); - String serverRunningMsg = isServerRunning ? String.format(getResources().getString(R.string.server_running), Utils.getIPAddress(true), port, folderPath) : + StringBuilder sb = new StringBuilder(); + for (String item : folderPathsAux) { + sb.append(item).append("\n"); + } + String serverRunningMsg = isServerRunning ? String.format(getResources().getString(R.string.server_running), Utils.getIPAddress(true), port, sb.toString()) : getResources().getString(R.string.server_stopped); tvServerState.setText(serverRunningMsg); diff --git a/app/src/main/java/com/jhonju/ps3netsrv/app/PS3NetService.java b/app/src/main/java/com/jhonju/ps3netsrv/app/PS3NetService.java index 984eb38..449a243 100644 --- a/app/src/main/java/com/jhonju/ps3netsrv/app/PS3NetService.java +++ b/app/src/main/java/com/jhonju/ps3netsrv/app/PS3NetService.java @@ -50,7 +50,7 @@ public void onCreate() { executorService = Executors.newSingleThreadExecutor(); int idListType = SettingsService.getListType(); EListType eListType = idListType == R.id.rbNone ? EListType.LIST_TYPE_NONE : idListType == R.id.rbAllowed ? EListType.LIST_TYPE_ALLOWED : EListType.LIST_TYPE_BLOCKED; - task = new PS3NetSrvTask(SettingsService.getPort(), SettingsService.getFolder(), SettingsService.getMaxConnections(), SettingsService.isReadOnly(), SettingsService.getIps(), eListType, exceptionHandler); + task = new PS3NetSrvTask(SettingsService.getPort(), SettingsService.getFolders(), SettingsService.getMaxConnections(), SettingsService.isReadOnly(), SettingsService.getIps(), eListType, exceptionHandler); } @Override diff --git a/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsActivity.java b/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsActivity.java index 1761a17..32c0248 100644 --- a/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsActivity.java +++ b/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsActivity.java @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Set; import static androidx.core.content.PermissionChecker.PERMISSION_GRANTED; @@ -73,9 +74,9 @@ private String saveMaxConnection() { private void loadSettings() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - ((TextInputLayout) findViewById(R.id.tilFolder)).getEditText().setText(Uri.parse(SettingsService.getFolder()).getPath()); + ((TextInputLayout) findViewById(R.id.tilFolder)).getEditText().setText(Uri.parse(SettingsService.getFolders().iterator().next()).getPath()); } else { - ((TextInputLayout) findViewById(R.id.tilFolder)).getEditText().setText(SettingsService.getFolder()); + ((TextInputLayout) findViewById(R.id.tilFolder)).getEditText().setText(SettingsService.getFolders().iterator().next()); } ((TextInputLayout) findViewById(R.id.tilPort)).getEditText().setText(SettingsService.getPort() + ""); ((TextInputLayout) findViewById(R.id.tilMaximumClientsNumber)).getEditText().setText(SettingsService.getMaxConnections() + ""); @@ -234,7 +235,9 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { private final SimpleFileChooser.FileSelectedListener onFileSelectedListener = new SimpleFileChooser.FileSelectedListener() { @Override public void onFileSelected(File file) { - SettingsService.setFolder(file.getAbsolutePath()); + Set folderAux = new HashSet<>(); + folderAux.add(file.getAbsolutePath()); + SettingsService.setFolders(folderAux); ((TextInputLayout) findViewById(R.id.tilFolder)).getEditText().setText(file.getAbsolutePath()); } }; @@ -245,7 +248,9 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICK_FOLDER && resultCode == RESULT_OK && data != null) { - SettingsService.setFolder(data.getData().toString()); + Set folderAux = new HashSet<>(); + folderAux.add(data.getData().toString()); + SettingsService.setFolders(folderAux); ((TextInputLayout) findViewById(R.id.tilFolder)).getEditText().setText(data.getData().getPath()); } } diff --git a/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsService.java b/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsService.java index d3e92c8..3a624ca 100644 --- a/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsService.java +++ b/app/src/main/java/com/jhonju/ps3netsrv/app/SettingsService.java @@ -13,6 +13,7 @@ public class SettingsService { private static final String settings = "settings"; private static SharedPreferences spPort = PS3NetSrvApp.getAppContext().getSharedPreferences("PORT",0); private static SharedPreferences spFolder = PS3NetSrvApp.getAppContext().getSharedPreferences("FOLDER",0); + private static SharedPreferences spFolders = PS3NetSrvApp.getAppContext().getSharedPreferences("FOLDERS",0); private static SharedPreferences spIps = PS3NetSrvApp.getAppContext().getSharedPreferences("IPS",0); private static SharedPreferences spListType = PS3NetSrvApp.getAppContext().getSharedPreferences("LIST_TYPE",0); private static SharedPreferences spMaxConnections = PS3NetSrvApp.getAppContext().getSharedPreferences("MAX_CONNECTIONS",0); @@ -22,8 +23,10 @@ public class SettingsService { public static Set getIps() { return spIps.getStringSet(settings, new HashSet()); } - public static String getFolder() { - return spFolder.getString(settings, getDefaultFolder()); + public static Set getFolders() { + HashSet folders = new HashSet(); + folders.add(spFolder.getString(settings, getDefaultFolder())); //if user has updated to this new version, reuse the settings. + return spFolders.getStringSet(settings, folders); } public static int getListType() { return spListType.getInt(settings, 0); } @@ -52,9 +55,9 @@ public static void setPort(int port) { editor.apply(); } - public static void setFolder(String folder) { - SharedPreferences.Editor editor = spFolder.edit(); - editor.putString(settings, folder); + public static void setFolders(Set folders) { + SharedPreferences.Editor editor = spFolders.edit(); + editor.putStringSet(settings, folders); editor.apply(); } diff --git a/app/src/main/java/com/jhonju/ps3netsrv/server/Context.java b/app/src/main/java/com/jhonju/ps3netsrv/server/Context.java index b73badb..0ec129e 100644 --- a/app/src/main/java/com/jhonju/ps3netsrv/server/Context.java +++ b/app/src/main/java/com/jhonju/ps3netsrv/server/Context.java @@ -15,23 +15,24 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; +import java.util.Set; public class Context { private Socket socket; - private final String rootDirectory; + private final Set rootDirectorys; private final boolean readOnly; private IFile file; private IRandomAccessFile readOnlyFile; private CDSectorSize cdSectorSize; - public Context(Socket socket, String rootDirectory, boolean readOnly) { - this.rootDirectory = rootDirectory; + public Context(Socket socket, Set rootDirectorys, boolean readOnly) { + this.rootDirectorys = rootDirectorys; this.socket = socket; this.cdSectorSize = CDSectorSize.CD_SECTOR_2352; this.readOnly = readOnly; } - public String getRootDirectory() { return rootDirectory; } + public Set getRootDirectorys() { return rootDirectorys; } public boolean isSocketConnected() { return socket.isConnected(); } diff --git a/app/src/main/java/com/jhonju/ps3netsrv/server/PS3NetSrvTask.java b/app/src/main/java/com/jhonju/ps3netsrv/server/PS3NetSrvTask.java index f98b77e..05410a0 100644 --- a/app/src/main/java/com/jhonju/ps3netsrv/server/PS3NetSrvTask.java +++ b/app/src/main/java/com/jhonju/ps3netsrv/server/PS3NetSrvTask.java @@ -11,7 +11,7 @@ public class PS3NetSrvTask implements Runnable { private final Thread.UncaughtExceptionHandler exceptionHandler; private final int port; - private final String folderPath; + private final Set folderPaths; private final int maxConnections; private final boolean readOnly; private final EListType listType; @@ -19,9 +19,9 @@ public class PS3NetSrvTask implements Runnable { private ServerSocket serverSocket; private boolean isRunning = true; - public PS3NetSrvTask(int port, String folderPath, int maxConnections, boolean readOnly, Set filterAddresses, EListType listType, Thread.UncaughtExceptionHandler exceptionHandler) { + public PS3NetSrvTask(int port, Set folderPaths, int maxConnections, boolean readOnly, Set filterAddresses, EListType listType, Thread.UncaughtExceptionHandler exceptionHandler) { this.port = port; - this.folderPath = folderPath; + this.folderPaths = folderPaths; this.maxConnections = maxConnections; this.readOnly = readOnly; this.filterAddresses = filterAddresses; @@ -45,7 +45,7 @@ public void run() { } continue; } - new ContextHandler(new Context(clientSocket, folderPath, readOnly), maxConnections, exceptionHandler).start(); + new ContextHandler(new Context(clientSocket, folderPaths, readOnly), maxConnections, exceptionHandler).start(); } } catch (IOException e) { exceptionHandler.uncaughtException(null, e); diff --git a/app/src/main/java/com/jhonju/ps3netsrv/server/commands/FileCommand.java b/app/src/main/java/com/jhonju/ps3netsrv/server/commands/FileCommand.java index 43e9a38..7e15b33 100644 --- a/app/src/main/java/com/jhonju/ps3netsrv/server/commands/FileCommand.java +++ b/app/src/main/java/com/jhonju/ps3netsrv/server/commands/FileCommand.java @@ -40,13 +40,32 @@ protected IFile getFile() throws IOException, PS3NetSrvException { } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - return new File(new java.io.File(ctx.getRootDirectory(), new String(buffer.array(), StandardCharsets.UTF_8).replaceAll("\\x00+$", ""))); + File file = null; + for (String rootDirectory : ctx.getRootDirectorys()) { + File fileAux = new File(new java.io.File(rootDirectory, new String(buffer.array(), StandardCharsets.UTF_8).replaceAll("\\x00+$", ""))); + if (fileAux.exists()) { + file = fileAux; + break; + } + } + if (file == null) { + send(ERROR_CODE_BYTEARRAY); + throw new PS3NetSrvException("ERROR: file not found."); + } + return file; } - androidx.documentfile.provider.DocumentFile documentFile = androidx.documentfile.provider.DocumentFile.fromTreeUri(PS3NetSrvApp.getAppContext(), Uri.parse(ctx.getRootDirectory())); - if (documentFile == null || !documentFile.exists()) { + androidx.documentfile.provider.DocumentFile documentFile = null; + for (String rootDirectory : ctx.getRootDirectorys()) { + androidx.documentfile.provider.DocumentFile documentFileAux = androidx.documentfile.provider.DocumentFile.fromTreeUri(PS3NetSrvApp.getAppContext(), Uri.parse(rootDirectory)); + if (documentFileAux.exists()) { + documentFile = documentFileAux; + break; + } + } + if (documentFile == null) { send(ERROR_CODE_BYTEARRAY); - throw new PS3NetSrvException("ERROR: wrong path configuration."); + throw new PS3NetSrvException("ERROR: file not found."); } String path = getFormattedPath(new String(buffer.array(), StandardCharsets.UTF_8)); diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 40e11ec..a45783a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -20,7 +20,7 @@ Iniciar servidor Detener servidor Servidor detenido - Servidor en ejecución en %s\npuerto %d\nRuta: %s + Servidor en ejecución en %s\npuerto %d\nRutas: %s Primero debe dar los permisos de lectura de almacenamiento Tipo de lista: Ninguna diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 2f6f022..3adc1cc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -18,7 +18,7 @@ Avviare il server Arrestare il server Il server è stato arrestato - Il server è in esecuzione su %s\nporta %d\ncartella %s + Il server è in esecuzione su %s\nporta %d\ncartelle: %s È necessario concedere prima i permessi di lettura dello storage Tipo di lista: Nessuno diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 54fcbd0..8fb5ccb 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -20,7 +20,7 @@ Iniciar servidor Parar servidor Servidor parado - Servidor em execução na %s\nporta %d\npasta %s + Servidor em execução na %s\nporta %d\npastas: %s Você precisa conceder permissões de leitura de armazenamento primeiro Tipo de lista: Nenhum diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index efa7e38..e9e74d8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,7 +28,7 @@ Start server Stop server Server is stopped - Server is running at %s\nport %d\nfolder %s + Server is running at %s\nport %d\nfolders: %s You need to grant permission to read storage first List type: None