Exemple #1
0
int readFile(int port)
{
	ControlPacket packet;
	while(!getControlPacket(port, &packet)){}
	//puts("\nGot beginning packet");
	if(packet.end != CONTROL_PACKET_BEGIN){
		printf("Error: didn't receive expected start control package\n");
		return -1;
	}

	int file = open(packet.filename+1, O_CREAT|O_TRUNC|O_WRONLY, 0666);
	free(packet.filename);
	DataPacket dataPacket;
	unsigned char expectedSequenceNumber = 0;
	float percentage;
	int acum = 0;
	char * proBar = updateProgressBar(0, packet.size, &percentage);
	while(getDataPacket(port, &dataPacket) != E_NOTDATA){

		if (expectedSequenceNumber != dataPacket.sequenceNumber){
			printf("Error in packet sequence: expected packet no %u and got packet no %u\n", expectedSequenceNumber, dataPacket.sequenceNumber);
		exit(-1);
		}
		expectedSequenceNumber++;
		expectedSequenceNumber %= 255;
		
		//printf("Received data packet with size %d\n", dataPacket.size);
		write(file, dataPacket.data, dataPacket.size);
		acum += dataPacket.size;
		proBar = updateProgressBar(acum, packet.size, &percentage);
		if(visMode != 0)
			printProgressBar(proBar, percentage);
		free(dataPacket.data);

	}
	printf("\n");
	unsigned char* dump;
	while(llread(port, &dump) != E_CLOSED){}	
	//puts("discei");
	return 0;
}
Exemple #2
0
int sendControlPacket(int fd, char *controlPacket, int sizeControlPacket) {
	unsigned char try = 0;
	while (try < MAX_TRY) {
		if (llwrite(fd, controlPacket, sizeControlPacket) > 0) return OK;
		try++;
	}
	return -1;
}

int sendInfoPacket(int fd, char *infoPacket, int sizeInfoPacket) {
	unsigned char try = 0;
	while (try < MAX_TRY) {
		if (llwrite(fd, infoPacket, sizeInfoPacket) > 0) return OK;
		try++;
	}
	return -1;
}

int sendFile(int fd, unsigned char fileNameSize, const char *fileName, unsigned int image_bytes_length, const char *image_bytes, unsigned  int* out_already_sent_bytes) {
	char controlPacket[MAX_CTRL_P];
	int sizeControlPacket;
	char infoPacket[MAX_INFO_P];
	int sizeInfoPacket;
	char info[L2 * 256 + L1]; 		// maximum size of info
	unsigned int infoSize;
	unsigned int maxInfoSize = L2 * 256 + L1;
	unsigned char N = 0;
	/*struct stat st;
	stat(fileName, &st);
	unsigned int fileSize = st.st_size;		// get file size from file statistics
	printf("File size: %d\n", fileSize);
	FILE *file;
	file = fopen(fileName, "r");
	sizeControlPacket = getControlPacket(START, fileSize, fileNameSize, fileName, controlPacket); // START control packet
	if (sendControlPacket(fd, controlPacket, sizeControlPacket) == OK) {
	int fileChar;
	while (1) {
	infoSize = 0;
	while ((fileChar = fgetc(file)) != EOF && infoSize < maxInfoSize) {
	info[infoSize] = (char) fileChar;
	infoSize++;
	}
	if (infoSize == 0) break;
	sizeInfoPacket = getInfoPacket(N, infoSize, info, infoPacket);
	if (sendInfoPacket(fd, infoPacket, sizeInfoPacket) == OK) N++;
	else {
	fclose(file);
	return -1;
	}
	}*/

	//(unsigned int)image_bytes_length: this casting is not the ideal solution but works for now
	sizeControlPacket = getControlPacket(START, (unsigned int)image_bytes_length, fileNameSize, fileName, controlPacket); // START control packet
	if (sendControlPacket(fd, controlPacket, sizeControlPacket) != OK)
		return -1;

	//printf("\n--fileName;%s\nimglength:%l\n", fileName, image_bytes_length);
	long i = 0;
	while (1) {
		infoSize = 0;
		while (i < image_bytes_length && infoSize < maxInfoSize) {
			info[infoSize] = image_bytes[i];
			infoSize++;
			i++;
		}
		if (infoSize == 0) break;
		sizeInfoPacket = getInfoPacket(N, infoSize, info, infoPacket);
		if (sendInfoPacket(fd, infoPacket, sizeInfoPacket) == OK)
		{
			++out_already_sent_bytes;
			N++;
		}
		else {
			//fclose(file);
			return -1;
		}
	}
	controlPacket[0] = CE; // END control packet
	if (sendControlPacket(fd, controlPacket, sizeControlPacket) == OK)
		return OK;

	return -1;
	/*
	controlPacket[0] = CE; // END control packet
	if (sendControlPacket(fd, controlPacket, sizeControlPacket) == OK) {
	fclose(file);
	return OK;
	}
	else {
	fclose(file);
	return -1;
	}
	}
	else return -1;	*/
}