Example #1
0
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)) );
}
Example #2
0
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;
}