parent
							
								
									ee478dfc9f
								
							
						
					
					
						commit
						5408d66a9e
					
				
					 7 changed files with 1274 additions and 139 deletions
				
			
		
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							|  | @ -47,12 +47,16 @@ JRE/JDK 8u60 or higher. | ||||||
| | GoldLeaf version | NS-USBloader version | | | GoldLeaf version | NS-USBloader version | | ||||||
| | ---------------- | -------------------- | | | ---------------- | -------------------- | | ||||||
| | v0.5             | v0.4 - v0.5.2, v0.8+ | | | v0.5             | v0.4 - v0.5.2, v0.8+ | | ||||||
|  | | v0.6             | none                 | | ||||||
| | v0.6.1           | v0.6                 | | | v0.6.1           | v0.6                 | | ||||||
| | v0.7 - 0.7.3     | v0.7 - v0.8+         | | | v0.7 - 0.7.3     | v0.7+                | | ||||||
|  | | v0.8             | v1.0+                | | ||||||
| 
 | 
 | ||||||
| ### Awoo support | where '+' means 'any next NS-USBloader version'. | ||||||
| 
 | 
 | ||||||
| Awoo-installer uses the same command-set (or 'protocol') to TinFoil. So just select 'TinFoil' in case you're going to use Awoo. | ### Awoo Installer support | ||||||
|  | 
 | ||||||
|  | Awoo Installer uses the same command-set (or 'protocol') to TinFoil. So just select 'TinFoil' in case you're going to use Awoo. | ||||||
| 
 | 
 | ||||||
| Also, please go to 'Settings' tab of NS-USBloader after first installation and check 'Allow XCI / NSZ / XCZ files selection for TinFoil' option. This installer can install not only NSPs but a way more formats! | Also, please go to 'Settings' tab of NS-USBloader after first installation and check 'Allow XCI / NSZ / XCZ files selection for TinFoil' option. This installer can install not only NSPs but a way more formats! | ||||||
| 
 | 
 | ||||||
|  | @ -63,13 +67,15 @@ Also, please go to 'Settings' tab of NS-USBloader after first installation and c | ||||||
| 
 | 
 | ||||||
| 2. `root # java -jar /path/to/NS-USBloader.jar` | 2. `root # java -jar /path/to/NS-USBloader.jar` | ||||||
| 
 | 
 | ||||||
| 3. Optional. Add user to 'udev' rules to use NS not-from-root-account | 3. Optional: add user to 'udev' rules to use NS not-from-root-account | ||||||
| ``` | ``` | ||||||
| root # vim /etc/udev/rules.d/99-NS.rules | root # vim /etc/udev/rules.d/99-NS.rules | ||||||
| SUBSYSTEM=="usb", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="3000", GROUP="plugdev" | SUBSYSTEM=="usb", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="3000", GROUP="plugdev" | ||||||
| root # udevadm control --reload-rules && udevadm trigger | root # udevadm control --reload-rules && udevadm trigger | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | Please note: you may have to change 'plugdev' group from example above to the different one. It's depends on you linux distro. | ||||||
|  | 
 | ||||||
| ##### macOS | ##### macOS | ||||||
| 
 | 
 | ||||||
| Double-click on downloaded .jar file. Follow instructions. Or see 'Linux' section. | Double-click on downloaded .jar file. Follow instructions. Or see 'Linux' section. | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							|  | @ -8,7 +8,7 @@ | ||||||
|     <name>NS-USBloader</name> |     <name>NS-USBloader</name> | ||||||
| 
 | 
 | ||||||
|     <artifactId>ns-usbloader</artifactId> |     <artifactId>ns-usbloader</artifactId> | ||||||
|     <version>0.9.1-SNAPSHOT</version> |     <version>1.0.0-SNAPSHOT</version> | ||||||
| 
 | 
 | ||||||
|     <url>https://github.com/developersu/ns-usbloader/</url> |     <url>https://github.com/developersu/ns-usbloader/</url> | ||||||
|     <description> |     <description> | ||||||
|  | @ -218,11 +218,11 @@ | ||||||
|                                 <minVersion>1.8</minVersion> |                                 <minVersion>1.8</minVersion> | ||||||
|                             </jre> |                             </jre> | ||||||
|                             <versionInfo> |                             <versionInfo> | ||||||
|                                 <fileVersion>0.8.0.0</fileVersion> |                                 <fileVersion>1.0.0.0</fileVersion> | ||||||
|                                 <txtFileVersion>${project.version}</txtFileVersion> |                                 <txtFileVersion>${project.version}</txtFileVersion> | ||||||
|                                 <fileDescription>TinFoil and GoldLeaf installer for your NS</fileDescription> |                                 <fileDescription>TinFoil and GoldLeaf installer for your NS</fileDescription> | ||||||
|                                 <copyright>GNU General Public License v3, 2019 ${organization.name}. Russia/LPR.</copyright> |                                 <copyright>GNU General Public License v3, 2019 ${organization.name}. Russia/LPR.</copyright> | ||||||
|                                 <productVersion>0.8.0.0</productVersion> |                                 <productVersion>1.0.0.0</productVersion> | ||||||
|                                 <txtProductVersion>${project.version}</txtProductVersion> |                                 <txtProductVersion>${project.version}</txtProductVersion> | ||||||
|                                 <companyName>${organization.name}</companyName> |                                 <companyName>${organization.name}</companyName> | ||||||
|                                 <productName>${project.name}</productName> |                                 <productName>${project.name}</productName> | ||||||
|  |  | ||||||
|  | @ -19,14 +19,14 @@ import java.util.*; | ||||||
| import java.util.concurrent.CompletableFuture; | import java.util.concurrent.CompletableFuture; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * GoldLeaf 0.7 - 0.7.3 processing |  * GoldLeaf 0.8 processing | ||||||
|  */ |  */ | ||||||
| class GoldLeaf extends TransferModule { | class GoldLeaf extends TransferModule { | ||||||
|     private boolean nspFilterForGl; |     private boolean nspFilterForGl; | ||||||
| 
 | 
 | ||||||
|     //                     CMD |     //                     CMD | ||||||
|     private final byte[] CMD_GLCO_SUCCESS = new byte[]{0x47, 0x4c, 0x43, 0x4F, 0x00, 0x00, 0x00, 0x00};         // used @ writeToUsb_GLCMD |     private final byte[] CMD_GLCO_SUCCESS = new byte[]{0x47, 0x4c, 0x43, 0x4F, 0x00, 0x00, 0x00, 0x00};         // used @ writeToUsb_GLCMD | ||||||
|     private final byte[] CMD_GLCO_FAILURE = new byte[]{0x47, 0x4c, 0x43, 0x4F, 0x64, (byte) 0xcb, 0x00, 0x00};  // used @ writeToUsb_GLCMD |     private final byte[] CMD_GLCO_FAILURE = new byte[]{0x47, 0x4c, 0x43, 0x4F, 0x00, 0x00, (byte) 0xAD, (byte) 0xDE};  // used @ writeToUsb_GLCMD TODO: TEST | ||||||
| 
 | 
 | ||||||
|     // System.out.println((356 & 0x1FF) | ((1 + 100) & 0x1FFF) << 9); // 52068 // 0x00 0x00 0xCB 0x64 |     // System.out.println((356 & 0x1FF) | ((1 + 100) & 0x1FFF) << 9); // 52068 // 0x00 0x00 0xCB 0x64 | ||||||
|     private final byte[] GL_OBJ_TYPE_FILE = new byte[]{0x01, 0x00, 0x00, 0x00}; |     private final byte[] GL_OBJ_TYPE_FILE = new byte[]{0x01, 0x00, 0x00, 0x00}; | ||||||
|  | @ -54,28 +54,31 @@ class GoldLeaf extends TransferModule { | ||||||
|     GoldLeaf(DeviceHandle handler, LinkedHashMap<String, File> nspMap, Task<Void> task, LogPrinter logPrinter, boolean nspFilter){ |     GoldLeaf(DeviceHandle handler, LinkedHashMap<String, File> nspMap, Task<Void> task, LogPrinter logPrinter, boolean nspFilter){ | ||||||
|         super(handler, nspMap, task, logPrinter); |         super(handler, nspMap, task, logPrinter); | ||||||
| 
 | 
 | ||||||
|         final byte CMD_GetDriveCount       = 0x00; |         final byte CMD_GetDriveCount       = 1; | ||||||
|         final byte CMD_GetDriveInfo        = 0x01; |         final byte CMD_GetDriveInfo        = 2; | ||||||
|         final byte CMD_StatPath            = 0x02; // proxy done [proxy: in case if folder contains ENG+RUS+UKR file names works incorrect] |         final byte CMD_StatPath            = 3; | ||||||
|         final byte CMD_GetFileCount        = 0x03; |         final byte CMD_GetFileCount        = 4; | ||||||
|         final byte CMD_GetFile             = 0x04; // proxy done |         final byte CMD_GetFile             = 5; | ||||||
|         final byte CMD_GetDirectoryCount   = 0x05; |         final byte CMD_GetDirectoryCount   = 6; | ||||||
|         final byte CMD_GetDirectory        = 0x06; // proxy done |         final byte CMD_GetDirectory        = 7; | ||||||
|         final byte CMD_ReadFile            = 0x07; // no way to do poxy |         final byte CMD_StartFile           = 8; // 1 -open read RAF; 2 open write RAF; 3 open write RAF and seek to EOF (???). | ||||||
|         final byte CMD_WriteFile           = 0x08; // add predictable behavior |         final byte CMD_ReadFile            = 9; | ||||||
|         final byte CMD_Create              = 0x09; |         final byte CMD_WriteFile           = 10; | ||||||
|         final byte CMD_Delete              = 0x0a;//10 |         final byte CMD_EndFile             = 11; // 1 - closed read RAF; 2 close write RAF. | ||||||
|         final byte CMD_Rename              = 0x0b;//11 |         final byte CMD_Create              = 12; | ||||||
|         final byte CMD_GetSpecialPathCount = 0x0c;//12  // Special folders count;             simplified usage @ NS-UL |         final byte CMD_Delete              = 13; | ||||||
|         final byte CMD_GetSpecialPath      = 0x0d;//13  // Information about special folders; simplified usage @ NS-UL |         final byte CMD_Rename              = 14; | ||||||
|         final byte CMD_SelectFile          = 0x0e;//14 |         final byte CMD_GetSpecialPathCount = 15; | ||||||
|         //final byte CMD_Max                 = 0x0f;//15  // not used @ NS-UL & GT |         final byte CMD_GetSpecialPath      = 16; | ||||||
|  |         final byte CMD_SelectFile          = 17; | ||||||
| 
 | 
 | ||||||
|         final byte[] CMD_GLCI = new byte[]{0x47, 0x4c, 0x43, 0x49}; |         final byte[] CMD_GLCI = new byte[]{0x47, 0x4c, 0x43, 0x49}; | ||||||
| 
 | 
 | ||||||
|         this.nspFilterForGl = nspFilter; |         this.nspFilterForGl = nspFilter; | ||||||
| 
 | 
 | ||||||
|         logPrinter.print("============= GoldLeaf =============\n\tVIRT:/ equals files added into the application\n\tHOME:/ equals " |         logPrinter.print("============= GoldLeaf v0.8 =============\n\t" + | ||||||
|  |                 "VIRT:/ equals files added into the application\n\t" + | ||||||
|  |                 "HOME:/ equals " | ||||||
|                 +System.getProperty("user.home"), EMsgType.INFO); |                 +System.getProperty("user.home"), EMsgType.INFO); | ||||||
| 
 | 
 | ||||||
|         // Let's collect file names to the array to simplify our life |         // Let's collect file names to the array to simplify our life | ||||||
|  | @ -196,6 +199,11 @@ class GoldLeaf extends TransferModule { | ||||||
|                         if (selectFile()) |                         if (selectFile()) | ||||||
|                             break main_loop; |                             break main_loop; | ||||||
|                         break; |                         break; | ||||||
|  |                     case CMD_StartFile: | ||||||
|  |                     case CMD_EndFile: | ||||||
|  |                         if (startOrEndFile()) | ||||||
|  |                             break main_loop; | ||||||
|  |                         break; | ||||||
|                     default: |                     default: | ||||||
|                         writeGL_FAIL("GL Unknown command: "+readByte[4]+" [it's a very bad sign]"); |                         writeGL_FAIL("GL Unknown command: "+readByte[4]+" [it's a very bad sign]"); | ||||||
|                 } |                 } | ||||||
|  | @ -230,6 +238,19 @@ class GoldLeaf extends TransferModule { | ||||||
|             splitReader = null; |             splitReader = null; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     /** | ||||||
|  |      * Handle StartFile & EndFile | ||||||
|  |      * NOTE: It's something internal for GL and used somehow by GL-PC-app, so just ignore this, at least for v0.8. | ||||||
|  |      * @return true if failed | ||||||
|  |      *         false if everything is ok | ||||||
|  |      * */ | ||||||
|  |     private boolean startOrEndFile(){ | ||||||
|  |         if (writeGL_PASS()){ | ||||||
|  |             logPrinter.print("GL Handle 'StartFile' command", EMsgType.FAIL); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|     /** |     /** | ||||||
|      * Handle GetDriveCount |      * Handle GetDriveCount | ||||||
|      * @return true if failed |      * @return true if failed | ||||||
|  | @ -714,7 +735,7 @@ class GoldLeaf extends TransferModule { | ||||||
|      *          false if everything is ok |      *          false if everything is ok | ||||||
|      * */ |      * */ | ||||||
|     private boolean readFile(String fileName, long offset, long size) { |     private boolean readFile(String fileName, long offset, long size) { | ||||||
|         //System.out.println("readFile "+fileName+" "+offset+" "+size+"\n"); |         //System.out.println("readFile "+fileName+"\t"+offset+"\t"+size+"\n"); | ||||||
|         if (fileName.startsWith("VIRT:/")){ |         if (fileName.startsWith("VIRT:/")){ | ||||||
|             // Let's find out which file requested |             // Let's find out which file requested | ||||||
|             String fNamePath = nspMap.get(fileName.substring(6)).getAbsolutePath();     // NOTE: 6 = "VIRT:/".length |             String fNamePath = nspMap.get(fileName.substring(6)).getAbsolutePath();     // NOTE: 6 = "VIRT:/".length | ||||||
|  | @ -776,8 +797,10 @@ class GoldLeaf extends TransferModule { | ||||||
|                 int bytesRead = splitReader.read(chunk); |                 int bytesRead = splitReader.read(chunk); | ||||||
|                 // Let's check that we read expected size |                 // Let's check that we read expected size | ||||||
|                 if (bytesRead != (int)size) |                 if (bytesRead != (int)size) | ||||||
|                     return writeGL_FAIL("GL Handle 'ReadFile' command [CMD]\n" + |                     return writeGL_FAIL("GL Handle 'ReadFile' command [CMD]" + | ||||||
|                             "    At offset: "+offset+"\n    Requested: "+size+"\n    Received:  "+bytesRead); |                             "\n         At offset: " + offset + | ||||||
|  |                             "\n         Requested: " + size + | ||||||
|  |                             "\n         Received:  " + bytesRead); | ||||||
|                 // Let's tell as a command about our result. |                 // Let's tell as a command about our result. | ||||||
|                 if (writeGL_PASS(longToArrLE(size))) { |                 if (writeGL_PASS(longToArrLE(size))) { | ||||||
|                     logPrinter.print("GL Handle 'ReadFile' command [CMD]", EMsgType.FAIL); |                     logPrinter.print("GL Handle 'ReadFile' command [CMD]", EMsgType.FAIL); | ||||||
|  | @ -792,7 +815,7 @@ class GoldLeaf extends TransferModule { | ||||||
|             } |             } | ||||||
|             else { |             else { | ||||||
|                 randAccessFile.seek(offset); |                 randAccessFile.seek(offset); | ||||||
|                 byte[] chunk = new byte[(int)size]; // WTF MAN? |                 byte[] chunk = new byte[(int)size];         // yes, I know, but nothing to do here. | ||||||
|                 // Let's find out how much bytes we got |                 // Let's find out how much bytes we got | ||||||
|                 int bytesRead = randAccessFile.read(chunk); |                 int bytesRead = randAccessFile.read(chunk); | ||||||
|                 // Let's check that we read expected size |                 // Let's check that we read expected size | ||||||
|  | @ -984,8 +1007,9 @@ class GoldLeaf extends TransferModule { | ||||||
|                     closeOpenedReadFilesGl();       // Could be a problem if GL glitches and slow down process. Or if user has extra-slow SD card. TODO: refactor |                     closeOpenedReadFilesGl();       // Could be a problem if GL glitches and slow down process. Or if user has extra-slow SD card. TODO: refactor | ||||||
|                     continue; |                     continue; | ||||||
|                 default: |                 default: | ||||||
|                     logPrinter.print("GL Data transfer issue [read]\n  Returned: "+UsbErrorCodes.getErrCode(result), EMsgType.FAIL); |                     logPrinter.print("GL Data transfer issue [read]\n         Returned: " + | ||||||
|                     logPrinter.print("GL Execution stopped", EMsgType.FAIL); |                             UsbErrorCodes.getErrCode(result) + | ||||||
|  |                             "\n         GL Execution stopped", EMsgType.FAIL); | ||||||
|                     return null; |                     return null; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -1012,8 +1036,9 @@ class GoldLeaf extends TransferModule { | ||||||
|                 case LibUsb.ERROR_TIMEOUT: |                 case LibUsb.ERROR_TIMEOUT: | ||||||
|                     continue; |                     continue; | ||||||
|                 default: |                 default: | ||||||
|                     logPrinter.print("GL Data transfer issue [read]\n  Returned: "+UsbErrorCodes.getErrCode(result), EMsgType.FAIL); |                     logPrinter.print("GL Data transfer issue [read]\n         Returned: " + | ||||||
|                     logPrinter.print("GL Execution stopped", EMsgType.FAIL); |                             UsbErrorCodes.getErrCode(result) + | ||||||
|  |                             "\n         GL Execution stopped", EMsgType.FAIL); | ||||||
|                     return null; |                     return null; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -1067,110 +1092,21 @@ class GoldLeaf extends TransferModule { | ||||||
|                     if (writeBufTransferred.get() == message.length) |                     if (writeBufTransferred.get() == message.length) | ||||||
|                         return false; |                         return false; | ||||||
|                     else { |                     else { | ||||||
|                         logPrinter.print("GL Data transfer issue [write]\n  Requested: "+message.length+"\n  Transferred: "+writeBufTransferred.get(), EMsgType.FAIL); |                         logPrinter.print("GL Data transfer issue [write]\n         Requested: " + | ||||||
|  |                                 message.length + | ||||||
|  |                                 "\n         Transferred: "+writeBufTransferred.get(), EMsgType.FAIL); | ||||||
|                         return true; |                         return true; | ||||||
|                     } |                     } | ||||||
|                 case LibUsb.ERROR_TIMEOUT: |                 case LibUsb.ERROR_TIMEOUT: | ||||||
|                     continue; |                     continue; | ||||||
|                 default: |                 default: | ||||||
|                     logPrinter.print("GL Data transfer issue [write]\n  Returned: "+ UsbErrorCodes.getErrCode(result), EMsgType.FAIL); |                     logPrinter.print("GL Data transfer issue [write]\n         Returned: " + | ||||||
|                     logPrinter.print("GL Execution stopped", EMsgType.FAIL); |                             UsbErrorCodes.getErrCode(result) + | ||||||
|  |                             "\n         GL Execution stopped", EMsgType.FAIL); | ||||||
|                     return true; |                     return true; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         logPrinter.print("GL Execution interrupted", EMsgType.INFO); |         logPrinter.print("GL Execution interrupted", EMsgType.INFO); | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     /*----------------------------------------------------*/ |  | ||||||
|     /*                  GL EXPERIMENTAL PART              */ |  | ||||||
|     /*                  (left for better times)           */ |  | ||||||
|     /*----------------------------------------------------*/ |  | ||||||
|         /* |  | ||||||
|         private boolean proxyStatPath(String path) { |  | ||||||
|             ByteBuffer writeBuffer = ByteBuffer.allocate(4096); |  | ||||||
|             List<byte[]> fileBytesSize = new LinkedList<>(); |  | ||||||
|             if ((recentDirs.length == 0) && (recentFiles.length == 0)) { |  | ||||||
|                 return writeGL_FAIL("proxyStatPath"); |  | ||||||
|             } |  | ||||||
|             if (recentDirs.length > 0){ |  | ||||||
|                 writeBuffer.put(CMD_GLCO_SUCCESS); |  | ||||||
|                 writeBuffer.put(GL_OBJ_TYPE_DIR); |  | ||||||
|                 byte[] resultingDir = writeBuffer.array(); |  | ||||||
|                 writeToUsb(resultingDir); |  | ||||||
|                 for (int i = 1; i < recentDirs.length; i++) { |  | ||||||
|                     readGL(); |  | ||||||
|                     writeToUsb(resultingDir); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             if (recentFiles.length > 0){ |  | ||||||
|                 path = path.replaceAll(recentDirs[0]+"$", "");  // Remove the name from path |  | ||||||
|                 for (String fileName : recentFiles){ |  | ||||||
|                     File f = new File(path+fileName); |  | ||||||
|                     fileBytesSize.add(longToArrLE(f.length())); |  | ||||||
|                 } |  | ||||||
|                 writeBuffer.clear(); |  | ||||||
|                 for (int i = 0; i < recentFiles.length; i++){ |  | ||||||
|                     readGL(); |  | ||||||
|                     writeBuffer.clear(); |  | ||||||
|                     writeBuffer.put(CMD_GLCO_SUCCESS); |  | ||||||
|                     writeBuffer.put(GL_OBJ_TYPE_FILE); |  | ||||||
|                     writeBuffer.put(fileBytesSize.get(i)); |  | ||||||
|                     writeToUsb(writeBuffer.array()); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private boolean proxyGetDirFile(boolean forDirs){ |  | ||||||
|             ByteBuffer writeBuffer = ByteBuffer.allocate(4096); |  | ||||||
|             List<byte[]> dirBytesNameSize = new LinkedList<>(); |  | ||||||
|             List<byte[]> dirBytesName = new LinkedList<>(); |  | ||||||
|             if (forDirs) { |  | ||||||
|                 if (recentDirs.length <= 0) |  | ||||||
|                     return writeGL_FAIL("proxyGetDirFile"); |  | ||||||
|                 for (String dirName : recentDirs) { |  | ||||||
|                     byte[] name = dirName.getBytes(StandardCharsets.UTF_16LE); |  | ||||||
|                     dirBytesNameSize.add(intToArrLE(name.length)); |  | ||||||
|                     dirBytesName.add(name); |  | ||||||
|                 } |  | ||||||
|                 writeBuffer.put(CMD_GLCO_SUCCESS); |  | ||||||
|                 writeBuffer.put(dirBytesNameSize.get(0)); |  | ||||||
|                 writeBuffer.put(dirBytesName.get(0)); |  | ||||||
|                 writeToUsb(writeBuffer.array()); |  | ||||||
|                 writeBuffer.clear(); |  | ||||||
|                 for (int i = 1; i < recentDirs.length; i++){ |  | ||||||
|                     readGL(); |  | ||||||
|                     writeBuffer.put(CMD_GLCO_SUCCESS); |  | ||||||
|                     writeBuffer.put(dirBytesNameSize.get(i)); |  | ||||||
|                     writeBuffer.put(dirBytesName.get(i)); |  | ||||||
|                     writeToUsb(writeBuffer.array()); |  | ||||||
|                     writeBuffer.clear(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 if (recentDirs.length <= 0) |  | ||||||
|                     return writeGL_FAIL("proxyGetDirFile"); |  | ||||||
|                 for (String dirName : recentFiles){ |  | ||||||
|                     byte[] name = dirName.getBytes(StandardCharsets.UTF_16LE); |  | ||||||
|                     dirBytesNameSize.add(intToArrLE(name.length)); |  | ||||||
|                     dirBytesName.add(name); |  | ||||||
|                 } |  | ||||||
|                 writeBuffer.put(CMD_GLCO_SUCCESS); |  | ||||||
|                 writeBuffer.put(dirBytesNameSize.get(0)); |  | ||||||
|                 writeBuffer.put(dirBytesName.get(0)); |  | ||||||
|                 writeToUsb(writeBuffer.array()); |  | ||||||
|                 writeBuffer.clear(); |  | ||||||
|                 for (int i = 1; i < recentFiles.length; i++){ |  | ||||||
|                     readGL(); |  | ||||||
|                     writeBuffer.put(CMD_GLCO_SUCCESS); |  | ||||||
|                     writeBuffer.put(dirBytesNameSize.get(i)); |  | ||||||
|                     writeBuffer.put(dirBytesName.get(i)); |  | ||||||
|                     writeToUsb(writeBuffer.array()); |  | ||||||
|                     writeBuffer.clear(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										1186
									
								
								src/main/java/nsusbloader/COM/USB/GoldLeaf_07.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1186
									
								
								src/main/java/nsusbloader/COM/USB/GoldLeaf_07.java
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -52,12 +52,20 @@ public class UsbCommunications extends Task<Void> { | ||||||
| 
 | 
 | ||||||
|         TransferModule module; |         TransferModule module; | ||||||
| 
 | 
 | ||||||
|         if (protocol.equals("TinFoil")) |         switch (protocol) { | ||||||
|  |             case "TinFoil": | ||||||
|                 module = new TinFoil(handler, nspMap, this, logPrinter); |                 module = new TinFoil(handler, nspMap, this, logPrinter); | ||||||
|         else if (protocol.equals("GoldLeaf")) |                 break; | ||||||
|  |             case "GoldLeaf": | ||||||
|                 module = new GoldLeaf(handler, nspMap, this, logPrinter, nspFilterForGl); |                 module = new GoldLeaf(handler, nspMap, this, logPrinter, nspFilterForGl); | ||||||
|         else |                 break; | ||||||
|  |             case "GoldLeafv0.7.x": | ||||||
|  |                 module = new GoldLeaf_07(handler, nspMap, this, logPrinter, nspFilterForGl); | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|                 module = new GoldLeaf_05(handler, nspMap, this, logPrinter); |                 module = new GoldLeaf_05(handler, nspMap, this, logPrinter); | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         usbConnect.close(); |         usbConnect.close(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -69,7 +69,7 @@ public class SettingsController implements Initializable { | ||||||
| 
 | 
 | ||||||
|     private HostServices hs; |     private HostServices hs; | ||||||
| 
 | 
 | ||||||
|     private static final String[] oldGlSupportedVersions = {"v0.5"}; |     private static final String[] oldGlSupportedVersions = {"v0.5", "v0.7.x"}; | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void initialize(URL url, ResourceBundle resourceBundle) { |     public void initialize(URL url, ResourceBundle resourceBundle) { | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ import java.util.Locale; | ||||||
| import java.util.ResourceBundle; | import java.util.ResourceBundle; | ||||||
| 
 | 
 | ||||||
| public class NSLMain extends Application { | public class NSLMain extends Application { | ||||||
|     public static final String appVersion = "v0.9.1"; |     public static final String appVersion = "v1.0"; | ||||||
|     @Override |     @Override | ||||||
|     public void start(Stage primaryStage) throws Exception{ |     public void start(Stage primaryStage) throws Exception{ | ||||||
|         FXMLLoader loader = new FXMLLoader(getClass().getResource("/NSLMain.fxml")); |         FXMLLoader loader = new FXMLLoader(getClass().getResource("/NSLMain.fxml")); | ||||||
|  | @ -59,9 +59,8 @@ public class NSLMain extends Application { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static void main(String[] args) { |     public static void main(String[] args) { | ||||||
|         if ((args.length == 1) && (args[0].equals("-v") || args[0].equals("--version"))){ |         if ((args.length == 1) && (args[0].equals("-v") || args[0].equals("--version"))) | ||||||
|             System.out.println("NS-USBloader "+NSLMain.appVersion); |             System.out.println("NS-USBloader "+NSLMain.appVersion); | ||||||
|         } |  | ||||||
|         else |         else | ||||||
|             launch(args); |             launch(args); | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Dmitry Isaenko
						Dmitry Isaenko