StatusModel::StatusModel( StatusListView *parentListView, QObject *parent ) : QStandardItemModel( 0, 0, parent ), statusList(0), maxStatusCount( 20 ), currentIndex( QModelIndex() ), view( parentListView ) { connect( view, SIGNAL(clicked(QModelIndex)), this, SLOT(selectStatus(QModelIndex)) ); connect( view, SIGNAL(moveFocus(bool)), this, SLOT(moveFocus(bool)) ); }
int main (int argc, char **argv) { if (argc < 2) { fprintf(stderr, "usage: webclient URL\n"); return EXIT_FAILURE; } char msg[BUFFER_LEN]; int vsocket; tUrl url = decodeUrl(argv[1]); if (url.status != SUCCESS) { fprintf(stderr, "Wrong format of URL.\n"); return EXIT_FAILURE; } char filename[BUFFER_LEN]; char filechar[BUFFER_LEN]; exctractFileName(url.path, filechar); strcpy(filename, filechar); codeUnsafeChar(url.domain); codeUnsafeChar(url.path); createRequest(msg, url); if (connectToServer(url, &vsocket) == FAILED) { fprintf(stderr, "Failed: connect to server\n"); return EXIT_FAILURE; } if (write(vsocket, msg, strlen(msg)) == FAILED) { fprintf(stderr, "Failed: write request\n"); return EXIT_FAILURE; } char answer[BUFFER_LEN]; if (readHeader(vsocket, answer) == FAILED) { fprintf(stderr, "Failed: read header\n"); return EXIT_FAILURE; } int enconding = selectEnconding(answer); tConn connection; connection = selectStatus(answer); if (connection.status >= 400) { fprintf(stderr, "%d\n",connection.status); return EXIT_FAILURE; } char msg_redir[BUFFER_LEN]; int connect_try = 1; tUrl url_redir; // Redirection while (connection.status == 301 || connection.status == 302) { if (selectLocation(answer, msg_redir) == FAILED) { fprintf(stderr, "Failed: redirection\n"); return EXIT_FAILURE; } url_redir = decodeUrl(msg_redir); if (url_redir.status != SUCCESS) { fprintf(stderr, "Failed: decode URL (redirection %d)\n",connect_try); return EXIT_FAILURE; } exctractFileName(url_redir.path, filename); codeUnsafeChar(url_redir.domain); codeUnsafeChar(url_redir.path); createRequest(msg_redir, url_redir); if (connectToServer(url_redir, &vsocket) == FAILED) { fprintf(stderr, "Failed: connect to server\n"); return EXIT_FAILURE; } if (write(vsocket, msg_redir, strlen(msg_redir)) == FAILED) { fprintf(stderr, "Failed: write request (redirection %d)\n",connect_try); return EXIT_FAILURE; } if (readHeader(vsocket, answer) == FAILED) { fprintf(stderr, "Failed: read header\n"); return EXIT_FAILURE; } enconding = selectEnconding(answer); connection = selectStatus(answer); if (connection.status == FAILED) { fprintf(stderr, "%s\n", connection.message); return EXIT_FAILURE; } if (connection.status >= 400) { fprintf(stderr, "%d\n",connection.status); return EXIT_FAILURE; } connect_try++; if (connect_try > 5) { fprintf(stderr, "Multiple (5) redirection."); return EXIT_FAILURE; } } FILE *fw; remove(filename); if ((fw = fopen(filename,"a")) == NULL) { fprintf(stderr, "Failed: open dest file\n"); return EXIT_FAILURE; } // Non-chunked coding if (enconding != CHUNKED) { char ch; while (read(vsocket, &ch, sizeof(char)) > 0) fprintf(fw,"%c",ch); fclose(fw); return SUCCESS; } // Chunked coding char chr1 = '#'; char chr2 = '#'; int i = 0; int chunk = 0; char ch[BUFFER_LEN]; while (read(vsocket, &chr2, sizeof(char)) > 0) { ch[i] = chr2; i++; if (chr1 == '\r' && chr2 == '\n') { ch[i-2] = '\0'; chunk = (int) strtol(ch, NULL, 16); i = 0; break; } chr1 = chr2; } int w = chunk; char p; while (w > 0) { if (read(vsocket, &p, sizeof(char)) == FAILED) { fprintf(stderr, "Failed: read data\n"); return EXIT_FAILURE; } w--; fprintf(fw, "%c", p); } char ch1 = '#', ch2 = '#'; chunk = -1; char chr[BUFFER_LEN]; int n = 0; while (chunk != 0) { if (read(vsocket, &ch2, sizeof(char)) == FAILED) { fprintf(stderr, "Failed: read chunk or \\r\\n\n"); return EXIT_FAILURE; } if (ch1 == '\r' && ch2 == '\n') { while (ch2 != '\r') { if (read(vsocket, &ch2, sizeof(char)) == FAILED) { fprintf(stderr, "Failed: read chunk\n"); return EXIT_FAILURE; } chr[i] = ch2; i++; } ch1 = ch2; chr[i] = '\0'; i = 0; if (read(vsocket, &ch2, sizeof(char)) == FAILED) { fprintf(stderr, "Failed: read chunked data\n"); return EXIT_FAILURE; } if (ch1 == '\r' && ch2 == '\n') { chunk = (int) strtol(chr, NULL, 16); if (chunk == 0) break; n = chunk; while (n > 0) { if (read(vsocket, &p, sizeof(char)) == FAILED) { fprintf(stderr, "Failed: read chunked data\n"); return EXIT_FAILURE; } n--; fprintf(fw, "%c", p); } ch2 = '#'; } } ch1 = ch2; } fclose(fw); return EXIT_SUCCESS; }