mirror of
https://github.com/workinghard/GuitarTeX2.git
synced 2025-12-17 03:58:02 +00:00
295 lines
9.8 KiB
Java
295 lines
9.8 KiB
Java
/*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
package guitartex2;
|
|
|
|
import java.io.DataInputStream;
|
|
import java.io.DataOutputStream;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.RandomAccessFile;
|
|
import java.util.zip.GZIPInputStream;
|
|
import java.util.zip.GZIPOutputStream;
|
|
|
|
class FileTransfer {
|
|
|
|
// Debug 0/1
|
|
int debug = 0;
|
|
|
|
// Define commands
|
|
//private static String quit = "CMD:123_QUIT_123";
|
|
//private static String transfer = "CMD:123_TRANSFER_123";
|
|
private static String ok = "CMD:123_OK_123";
|
|
private static String failed = "CMD:123_FAILED_123";
|
|
|
|
// Father ID
|
|
int fId;
|
|
|
|
// Streams
|
|
DataInputStream inStream;
|
|
DataOutputStream outStream;
|
|
|
|
// Main - Constructor
|
|
public FileTransfer(int id, DataInputStream inputStream, DataOutputStream outputStream) {
|
|
fId = id;
|
|
inStream = inputStream;
|
|
outStream = outputStream;
|
|
}
|
|
|
|
public FileTransfer(int id, int mDebug, DataInputStream inputStream, DataOutputStream outputStream) {
|
|
debug = mDebug;
|
|
fId = id;
|
|
inStream = inputStream;
|
|
outStream = outputStream;
|
|
}
|
|
|
|
@SuppressWarnings("UnusedAssignment")
|
|
public int sendFile(String myFile) {
|
|
RandomAccessFile in;
|
|
|
|
long length;
|
|
String fileLengthResult;
|
|
|
|
int zipResult = gzipFile(myFile, false);
|
|
if (zipResult == 0) {
|
|
myFile = myFile + ".gz";
|
|
} else {
|
|
sendMsg("Filetransfer[" + fId + "]: can't gzip file");
|
|
try {
|
|
outStream.writeInt(0);
|
|
fileLengthResult = inStream.readUTF();
|
|
} catch (Exception e) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error" + e);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
|
|
try {
|
|
in = new RandomAccessFile(myFile, "r");
|
|
length = in.length();
|
|
} catch (Exception g) {
|
|
sendMsg("Filetransfer[" + fId + "]: can't read file" + g);
|
|
try {
|
|
outStream.writeInt(0);
|
|
fileLengthResult = inStream.readUTF();
|
|
} catch (Exception h) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error" + h);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
if (length > Integer.MAX_VALUE) {
|
|
// File is too large
|
|
sendMsg("Filetransfer[" + fId + "]: File is too large");
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
} else {
|
|
int myFileLength = (int) length;
|
|
sendMsg("Filetransfer[" + fId + "]: sending fille length: " + myFileLength);
|
|
try {
|
|
outStream.writeInt(myFileLength);
|
|
fileLengthResult = inStream.readUTF();
|
|
} catch (Exception i) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error" + i);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
if (fileLengthResult.equals(ok)) {
|
|
try {
|
|
sendMsg("Filetransfer[" + fId + "]: send a file...");
|
|
byte b;
|
|
for (int i = 0; i < myFileLength; i++) {
|
|
b = in.readByte();
|
|
outStream.writeByte(b);
|
|
}
|
|
in.close();
|
|
File f = new File(myFile);
|
|
f.delete();
|
|
String fileTransferResult = inStream.readUTF();
|
|
if (fileTransferResult.equals(failed)) {
|
|
sendMsg("Filetransfer[" + fId + "]: sending file failed: " + fileTransferResult);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
} catch (Exception j) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error" + j);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
} else {
|
|
sendMsg("Filetransfer[" + fId + "]: sending file length failed: " + fileLengthResult);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public int receiveFile(String myFile) {
|
|
int fileLength;
|
|
RandomAccessFile out;
|
|
|
|
sendMsg("Filetransfer[" + fId + "]: awaiting filelength ...");
|
|
try {
|
|
fileLength = inStream.readInt();
|
|
} catch (IOException e) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error " + e);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
sendMsg("Filetransfer[" + fId + "]: file length = " + fileLength);
|
|
if (fileLength > 0) {
|
|
try {
|
|
out = new RandomAccessFile(myFile + ".gz", "rw");
|
|
} catch (IOException g) {
|
|
sendMsg("Filetransfer[" + fId + "]: can't write to a file " + g);
|
|
try {
|
|
outStream.writeUTF(failed);
|
|
} catch (Exception h) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error " + h);
|
|
}
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
try {
|
|
outStream.writeUTF(ok);
|
|
} catch (Exception i) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error " + i);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
sendMsg("Filetransfer[" + fId + "]: awaiting file...");
|
|
try {
|
|
byte b;
|
|
for (int i = 0; i < fileLength; i++) {
|
|
b = inStream.readByte();
|
|
out.write(b);
|
|
}
|
|
out.close();
|
|
} catch (Exception j) {
|
|
sendMsg("Filetransfer[" + fId + "]: file transfer failed " + j);
|
|
try {
|
|
outStream.writeUTF(failed);
|
|
} catch (Exception k) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error " + k);
|
|
}
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
try {
|
|
outStream.writeUTF(ok);
|
|
int gunzipResult = gunzipFile(myFile + ".gz", true);
|
|
if (gunzipResult != 0) {
|
|
sendMsg("Filetransfer[" + fId + "]: gunzip failed");
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
} catch (Exception l) {
|
|
sendMsg("Filetransfer[" + fId + "]: stream error " + l);
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
sendMsg("Filetransfer[" + fId + "]: file transfer complete.");
|
|
} else {
|
|
try {
|
|
outStream.writeUTF(failed);
|
|
} catch (Exception f) {
|
|
sendMsg("Filetransfer[" + fId + "]: file length invalid");
|
|
cleanTmp(myFile);
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private int gzipFile(String myFile, boolean delSource) {
|
|
int read;
|
|
byte[] data = new byte[1024];
|
|
sendMsg("Filetransfer[" + fId + "]: gzip file");
|
|
try {
|
|
File f = new File(myFile);
|
|
GZIPOutputStream out;
|
|
try (FileInputStream in = new FileInputStream(f)) {
|
|
out = new GZIPOutputStream(new FileOutputStream(myFile + ".gz"));
|
|
while ((read = in.read(data, 0, 1024)) != -1) {
|
|
out.write(data, 0, read);
|
|
}
|
|
}
|
|
out.close();
|
|
if (delSource == true) {
|
|
f.delete();
|
|
}
|
|
} catch (Exception e) {
|
|
sendMsg("Filetransfer[" + fId + "]: gzipping file failed " + e);
|
|
return 1;
|
|
}
|
|
|
|
sendMsg("Filetransfer[" + fId + "]: gzip file");
|
|
return 0;
|
|
}
|
|
|
|
private int gunzipFile(String myGZFile, boolean delSource) {
|
|
int read;
|
|
byte[] data = new byte[1024];
|
|
|
|
sendMsg("Filetransfer[" + fId + "]: gunzip file");
|
|
|
|
try {
|
|
File f = new File(myGZFile);
|
|
FileOutputStream out;
|
|
try (GZIPInputStream in = new GZIPInputStream(new FileInputStream(f))) {
|
|
String myFile;
|
|
if (myGZFile.endsWith(".gz")) {
|
|
myFile = myGZFile.substring(0, myGZFile.length() - 3);
|
|
} else {
|
|
myFile = myGZFile;
|
|
} out = new FileOutputStream(myFile);
|
|
while ((read = in.read(data, 0, 1024)) != -1) {
|
|
out.write(data, 0, read);
|
|
}
|
|
}
|
|
out.close();
|
|
if (delSource == true) {
|
|
f.delete();
|
|
}
|
|
} catch (Exception e) {
|
|
sendMsg("Filetransfer[" + fId + "]: gunzipping file failed " + e);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private void sendMsg(String msg) {
|
|
if (debug == 1) {
|
|
System.out.println(msg);
|
|
}
|
|
}
|
|
|
|
private void cleanTmp(String fileName) {
|
|
try {
|
|
new File(fileName).delete();
|
|
} catch (Exception e) {
|
|
sendMsg("can't clean tmp file: " + e);
|
|
}
|
|
}
|
|
}
|