This commit is contained in:
2016-04-07 20:14:18 -07:00
commit a4cb08398b
170 changed files with 12068 additions and 0 deletions

View File

@@ -0,0 +1,294 @@
/*
* 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);
}
}
}