#include #include #include #include #include #include "Client.h" #include "String.h" Client client; void interruptHandler(int signal) { clientRemove(&client); exit(EXIT_SUCCESS); } int readNumber(const char* text) { while(1) { int number; printf("%s", text); int result = scanf("%d", &number); char c = getchar(); while(c != EOF && c != '\n') { c = getchar(); } if(result != 0) { return number; } } return -1; } void waitForData() { while(1) { printf("Type a command: "); String s; stringInit(&s); stringRead(&s); if(stringCompare(&s, "SEND")) { printf("Sending a mail to the server...\n"); //outgoing stream Stream out; streamInit(&out, 128); streamWriteInt(&out, 0); // sender printf("Type a sender with at most 8 characters: "); String sender; stringInit(&sender); stringRead(&sender); int l = stringGetLength(&sender); while(l < 1 || l > 8) { printf("Please type a valid sender: "); stringRemove(&sender); stringInit(&sender); stringRead(&sender); l = stringGetLength(&sender); } streamWriteChars(&out, sender.data); streamWriteChar(&out, '\n'); stringRemove(&sender); // receiver printf("Type a receiver with at most 8 characters: "); String receiver; stringInit(&receiver); stringRead(&receiver); l = stringGetLength(&receiver); while(l < 1 || l > 8) { printf("Please type a valid receiver: "); stringRemove(&receiver); stringInit(&receiver); stringRead(&receiver); l = stringGetLength(&receiver); } streamWriteChars(&out, receiver.data); streamWriteChar(&out, '\n'); stringRemove(&receiver); // subject printf("Type a subject with at most 80 characters: "); String subject; stringInit(&subject); stringRead(&subject); l = stringGetLength(&subject); while(l < 1 || l > 80) { printf("Please type a valid receiver: "); stringRemove(&subject); stringInit(&subject); stringRead(&subject); l = stringGetLength(&subject); } streamWriteChars(&out, subject.data); streamWriteChar(&out, '\n'); stringRemove(&subject); // message printf("Type a message: "); String message; stringInit(&message); stringRead(&message); streamWriteChars(&out, message.data); streamWriteChars(&out, "\n.\n"); stringRemove(&message); // send and clear stream clientSendData(&client, &out); streamRemove(&out); } else if(stringCompare(&s, "LIST")) { //outgoing stream Stream out; streamInit(&out, 16); streamWriteInt(&out, 1); // user printf("Type a user with at most 8 characters: "); String sender; stringInit(&sender); stringRead(&sender); int l = stringGetLength(&sender); while(l < 1 || l > 8) { printf("Please type a valid user: "); stringRemove(&sender); stringInit(&sender); stringRead(&sender); l = stringGetLength(&sender); } streamWriteChars(&out, sender.data); streamWriteChar(&out, '\n'); stringRemove(&sender); // send and clear stream clientSendData(&client, &out); streamRemove(&out); } else if(stringCompare(&s, "READ")) { //outgoing stream Stream out; streamInit(&out, 16); streamWriteInt(&out, 2); // user printf("Type a user with at most 8 characters: "); String sender; stringInit(&sender); stringRead(&sender); int l = stringGetLength(&sender); while(l < 1 || l > 8) { printf("Please type a valid user: "); stringRemove(&sender); stringInit(&sender); stringRead(&sender); l = stringGetLength(&sender); } streamWriteChars(&out, sender.data); streamWriteChar(&out, '\n'); stringRemove(&sender); // message number int number = readNumber("Type a message number: "); streamWriteInt(&out, number); streamWriteChar(&out, '\n'); // send and clear stream clientSendData(&client, &out); streamRemove(&out); } else if(stringCompare(&s, "DEL")) { //outgoing stream Stream out; streamInit(&out, 16); streamWriteInt(&out, 3); // user printf("Type a user with at most 8 characters: "); String sender; stringInit(&sender); stringRead(&sender); int l = stringGetLength(&sender); while(l < 1 || l > 8) { printf("Please type a valid user: "); stringRemove(&sender); stringInit(&sender); stringRead(&sender); l = stringGetLength(&sender); } streamWriteChars(&out, sender.data); streamWriteChar(&out, '\n'); stringRemove(&sender); // message number int number = readNumber("Type a message number: "); streamWriteInt(&out, number); streamWriteChar(&out, '\n'); // send and clear stream clientSendData(&client, &out); streamRemove(&out); } else if(stringCompare(&s, "QUIT")) { Stream out; streamInit(&out, 16); streamWriteInt(&out, 4); clientSendData(&client, &out); streamRemove(&out); } stringRemove(&s); } } void packageAnswer(Stream* in) { char buffer[32]; streamGetChars(in, buffer, 32); printf("%s\n", buffer); } void packageList(Stream* in) { int number; if(streamGetInt(in, &number) == -1) { return; } if(number == 1) { printf("\nYou have %d mail.\n", number); } else { printf("\nYou have %d mails.\n", number); } char c; while(streamGetChar(in, &c) != -1) { fputc(c, stdout); } fputc('\n', stdout); } void packageReadDel(Stream* in) { char c; while(streamGetChar(in, &c) != -1) { fputc(c, stdout); } fputc('\n', stdout); } int main(int argc, char** argv) { if(argc < 2) { printf("Usage: %s server_address\n", argv[0]); return EXIT_FAILURE; } clientInitDefaults(&client); signal(SIGINT, interruptHandler); signal(SIGKILL, interruptHandler); if(clientInit(&client, argv[1], 6543) == -1) { return EXIT_FAILURE; } clientRegisterHandler(&client, packageAnswer); clientRegisterHandler(&client, packageList); clientRegisterHandler(&client, packageReadDel); waitForData(); clientRemove(&client); return EXIT_SUCCESS; }