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; }
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; */ }