Lines Matching refs:part
11 * you should have received as part of this distribution. The terms
67 curl_mimepart *part);
68 static curl_off_t encoder_nop_size(curl_mimepart *part);
70 curl_mimepart *part);
72 curl_mimepart *part);
73 static curl_off_t encoder_base64_size(curl_mimepart *part);
75 curl_mimepart *part);
76 static curl_off_t encoder_qp_size(curl_mimepart *part);
382 struct curl_mimepart *part)
384 struct mime_encoder_state *st = &part->encstate;
402 static curl_off_t encoder_nop_size(curl_mimepart *part)
404 return part->datasize;
410 curl_mimepart *part)
412 struct mime_encoder_state *st = &part->encstate;
436 curl_mimepart *part)
438 struct mime_encoder_state *st = &part->encstate;
514 static curl_off_t encoder_base64_size(curl_mimepart *part)
516 curl_off_t size = part->datasize;
549 curl_mimepart *part)
551 struct mime_encoder_state *st = &part->encstate;
649 static curl_off_t encoder_qp_size(curl_mimepart *part)
653 return part->datasize? -1: 0;
658 /* Argument is a pointer to the mime part. */
662 curl_mimepart *part = (curl_mimepart *) instream;
663 size_t sz = curlx_sotouz(part->datasize - part->state.offset);
673 memcpy(buffer, part->data + curlx_sotouz(part->state.offset), sz);
680 curl_mimepart *part = (curl_mimepart *) instream;
684 offset += part->state.offset;
687 offset += part->datasize;
691 if(offset < 0 || offset > part->datasize)
694 part->state.offset = offset;
705 /* Argument is a pointer to the mime part. */
706 static int mime_open_file(curl_mimepart *part)
708 /* Open a MIMEKIND_FILE part. */
710 if(part->fp)
712 part->fp = fopen_read(part->data, "rb");
713 return part->fp? 0: -1;
719 curl_mimepart *part = (curl_mimepart *) instream;
724 if(mime_open_file(part))
727 return fread(buffer, size, nitems, part->fp);
732 curl_mimepart *part = (curl_mimepart *) instream;
734 if(whence == SEEK_SET && !offset && !part->fp)
737 if(mime_open_file(part))
740 return fseek(part->fp, (long) offset, whence)?
746 curl_mimepart *part = (curl_mimepart *) ptr;
748 if(part->fp) {
749 fclose(part->fp);
750 part->fp = NULL;
752 Curl_safefree(part->data);
788 /* Read a non-encoded part content. */
789 static size_t read_part_content(curl_mimepart *part,
794 switch(part->lastreadstatus) {
799 return part->lastreadstatus;
804 /* If we can determine we are at end of part data, spare a read. */
805 if(part->datasize != (curl_off_t) -1 &&
806 part->state.offset >= part->datasize) {
810 switch(part->kind) {
816 sz = mime_subparts_read(buffer, 1, bufsize, part->arg, hasread);
819 if(part->fp && feof(part->fp))
823 if(part->readfunc) {
824 if(!(part->flags & MIME_FAST_READ)) {
829 sz = part->readfunc(buffer, 1, bufsize, part->arg);
842 part->lastreadstatus = sz;
845 part->state.offset += sz;
846 part->lastreadstatus = sz;
853 /* Read and encode part content. */
854 static size_t read_encoded_part_content(curl_mimepart *part, char *buffer,
857 struct mime_encoder_state *st = &part->encstate;
865 sz = part->encoder->encodefunc(buffer, bufsize, ateof, part);
893 sz = read_part_content(part, st->buf + st->bufend,
913 /* Readback a mime part. */
914 static size_t readback_part(curl_mimepart *part,
919 /* Readback from part. */
923 struct curl_slist *hdr = (struct curl_slist *) part->state.ptr;
924 switch(part->state.state) {
926 mimesetstate(&part->state,
927 (part->flags & MIME_BODY_ONLY)?
929 part->curlheaders);
933 mimesetstate(&part->state, MIMESTATE_EOH, NULL);
937 mimesetstate(&part->state, MIMESTATE_USERHEADERS, hdr->next);
943 mimesetstate(&part->state, MIMESTATE_USERHEADERS, part->userheaders);
945 sz = readback_bytes(&part->state, buffer, bufsize,
948 mimesetstate(&part->state, part->state.state, hdr->next);
952 sz = readback_bytes(&part->state, buffer, bufsize, STRCONST("\r\n"),
955 mimesetstate(&part->state, MIMESTATE_BODY, NULL);
958 cleanup_encoder_state(&part->encstate);
959 mimesetstate(&part->state, MIMESTATE_CONTENT, NULL);
962 if(part->encoder)
963 sz = read_encoded_part_content(part, buffer, bufsize, hasread);
965 sz = read_part_content(part, buffer, bufsize, hasread);
968 mimesetstate(&part->state, MIMESTATE_END, NULL);
970 if(part->kind == MIMEKIND_FILE && part->fp) {
971 fclose(part->fp);
972 part->fp = NULL;
985 break; /* Other values not in part state. */
1007 curl_mimepart *part = mime->state.ptr;
1021 mimesetstate(&mime->state, MIMESTATE_BOUNDARY2, part);
1024 if(part)
1031 mimesetstate(&mime->state, MIMESTATE_CONTENT, part);
1035 if(!part) {
1039 sz = readback_part(part, buffer, nitems, hasread);
1047 mimesetstate(&mime->state, MIMESTATE_BOUNDARY1, part->nextpart);
1066 static int mime_part_rewind(curl_mimepart *part)
1071 if(part->flags & MIME_BODY_ONLY)
1073 cleanup_encoder_state(&part->encstate);
1074 if(part->state.state > targetstate) {
1076 if(part->seekfunc) {
1077 res = part->seekfunc(part->arg, (curl_off_t) 0, SEEK_SET);
1094 mimesetstate(&part->state, targetstate, NULL);
1096 part->lastreadstatus = 1; /* Successful read status. */
1103 curl_mimepart *part;
1112 for(part = mime->firstpart; part; part = part->nextpart) {
1113 int res = mime_part_rewind(part);
1124 /* Release part content. */
1125 static void cleanup_part_content(curl_mimepart *part)
1127 if(part->freefunc)
1128 part->freefunc(part->arg);
1130 part->readfunc = NULL;
1131 part->seekfunc = NULL;
1132 part->freefunc = NULL;
1133 part->arg = (void *) part; /* Defaults to part itself. */
1134 part->data = NULL;
1135 part->fp = NULL;
1136 part->datasize = (curl_off_t) 0; /* No size yet. */
1137 cleanup_encoder_state(&part->encstate);
1138 part->kind = MIMEKIND_NONE;
1139 part->flags &= ~MIME_FAST_READ;
1140 part->lastreadstatus = 1; /* Successful read status. */
1141 part->state.state = MIMESTATE_BEGIN;
1150 cleanup_part_content(mime->parent); /* Avoid dangling pointer in part. */
1162 cleanup_part_content(mime->parent); /* Avoid dangling pointer in part. */
1168 void Curl_mime_cleanpart(curl_mimepart *part)
1170 if(part) {
1171 cleanup_part_content(part);
1172 curl_slist_free_all(part->curlheaders);
1173 if(part->flags & MIME_USERHEADERS_OWNER)
1174 curl_slist_free_all(part->userheaders);
1175 Curl_safefree(part->mimetype);
1176 Curl_safefree(part->name);
1177 Curl_safefree(part->filename);
1178 Curl_mime_initpart(part);
1185 curl_mimepart *part;
1190 part = mime->firstpart;
1191 mime->firstpart = part->nextpart;
1192 Curl_mime_cleanpart(part);
1193 free(part);
1228 to the part. */
1306 /* Initialize a mime part. */
1307 void Curl_mime_initpart(curl_mimepart *part)
1309 memset((char *) part, 0, sizeof(*part));
1310 part->lastreadstatus = 1; /* Successful read status. */
1311 mimesetstate(&part->state, MIMESTATE_BEGIN, NULL);
1314 /* Create a mime part and append it to a mime handle's part list. */
1317 curl_mimepart *part;
1322 part = (curl_mimepart *) malloc(sizeof(*part));
1324 if(part) {
1325 Curl_mime_initpart(part);
1326 part->parent = mime;
1329 mime->lastpart->nextpart = part;
1331 mime->firstpart = part;
1333 mime->lastpart = part;
1336 return part;
1339 /* Set mime part name. */
1340 CURLcode curl_mime_name(curl_mimepart *part, const char *name)
1342 if(!part)
1345 Curl_safefree(part->name);
1348 part->name = strdup(name);
1349 if(!part->name)
1356 /* Set mime part remote file name. */
1357 CURLcode curl_mime_filename(curl_mimepart *part, const char *filename)
1359 if(!part)
1362 Curl_safefree(part->filename);
1365 part->filename = strdup(filename);
1366 if(!part->filename)
1373 /* Set mime part content from memory data. */
1374 CURLcode curl_mime_data(curl_mimepart *part,
1377 if(!part)
1380 cleanup_part_content(part);
1386 part->data = Curl_memdup0(ptr, datasize);
1387 if(!part->data)
1390 part->datasize = datasize;
1391 part->readfunc = mime_mem_read;
1392 part->seekfunc = mime_mem_seek;
1393 part->freefunc = mime_mem_free;
1394 part->flags |= MIME_FAST_READ;
1395 part->kind = MIMEKIND_DATA;
1401 /* Set mime part content from named local file. */
1402 CURLcode curl_mime_filedata(curl_mimepart *part, const char *filename)
1406 if(!part)
1409 cleanup_part_content(part);
1418 part->data = strdup(filename);
1419 if(!part->data)
1422 part->datasize = -1;
1424 part->datasize = filesize(filename, sbuf);
1425 part->seekfunc = mime_file_seek;
1428 part->readfunc = mime_file_read;
1429 part->freefunc = mime_file_free;
1430 part->kind = MIMEKIND_FILE;
1440 CURLcode res = curl_mime_filename(part, base);
1450 /* Set mime part type. */
1451 CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype)
1453 if(!part)
1456 Curl_safefree(part->mimetype);
1459 part->mimetype = strdup(mimetype);
1460 if(!part->mimetype)
1468 CURLcode curl_mime_encoder(curl_mimepart *part, const char *encoding)
1473 if(!part)
1476 part->encoder = NULL;
1483 part->encoder = mep;
1490 /* Set mime part headers. */
1491 CURLcode curl_mime_headers(curl_mimepart *part,
1494 if(!part)
1497 if(part->flags & MIME_USERHEADERS_OWNER) {
1498 if(part->userheaders != headers) /* Allow setting twice the same list. */
1499 curl_slist_free_all(part->userheaders);
1500 part->flags &= ~MIME_USERHEADERS_OWNER;
1502 part->userheaders = headers;
1504 part->flags |= MIME_USERHEADERS_OWNER;
1508 /* Set mime part content from callback. */
1509 CURLcode curl_mime_data_cb(curl_mimepart *part, curl_off_t datasize,
1514 if(!part)
1517 cleanup_part_content(part);
1520 part->readfunc = readfunc;
1521 part->seekfunc = seekfunc;
1522 part->freefunc = freefunc;
1523 part->arg = arg;
1524 part->datasize = datasize;
1525 part->kind = MIMEKIND_CALLBACK;
1531 /* Set mime part content from subparts. */
1532 CURLcode Curl_mime_set_subparts(curl_mimepart *part,
1537 if(!part)
1541 if(part->kind == MIMEKIND_MULTIPART && part->arg == subparts)
1544 cleanup_part_content(part);
1551 /* Should not be the part's root. */
1552 root = part->parent;
1562 subparts->parent = part;
1564 part->seekfunc = mime_subparts_seek;
1565 part->freefunc = take_ownership? mime_subparts_free: mime_subparts_unbind;
1566 part->arg = subparts;
1567 part->datasize = -1;
1568 part->kind = MIMEKIND_MULTIPART;
1574 CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts)
1576 return Curl_mime_set_subparts(part, subparts, TRUE);
1581 /* Argument is the dummy top part. */
1584 curl_mimepart *part = (curl_mimepart *) instream;
1592 ret = readback_part(part, buffer, nitems, &hasread);
1605 CURLcode Curl_mime_rewind(curl_mimepart *part)
1607 return mime_part_rewind(part) == CURL_SEEKFUNC_OK?
1628 curl_mimepart *part;
1636 for(part = mime->firstpart; part; part = part->nextpart) {
1637 curl_off_t sz = Curl_mime_size(part);
1650 curl_off_t Curl_mime_size(curl_mimepart *part)
1654 if(part->kind == MIMEKIND_MULTIPART)
1655 part->datasize = multipart_size(part->arg);
1657 size = part->datasize;
1659 if(part->encoder)
1660 size = part->encoder->sizefunc(part);
1662 if(size >= 0 && !(part->flags & MIME_BODY_ONLY)) {
1663 /* Compute total part size. */
1664 size += slist_size(part->curlheaders, 2, NULL, 0);
1665 size += slist_size(part->userheaders, 2, STRCONST("Content-Type"));
1758 curl_mimepart *part,
1770 curl_slist_free_all(part->curlheaders);
1771 part->curlheaders = NULL;
1774 if(part->state.state == MIMESTATE_CURLHEADERS)
1775 mimesetstate(&part->state, MIMESTATE_CURLHEADERS, NULL);
1778 customct = part->mimetype;
1780 customct = search_header(part->userheaders, STRCONST("Content-Type"));
1786 switch(part->kind) {
1791 contenttype = Curl_mime_contenttype(part->filename);
1793 contenttype = Curl_mime_contenttype(part->data);
1794 if(!contenttype && part->filename)
1798 contenttype = Curl_mime_contenttype(part->filename);
1803 if(part->kind == MIMEKIND_MULTIPART) {
1804 mime = (curl_mime *) part->arg;
1810 if(strategy == MIMESTRATEGY_MAIL || !part->filename)
1814 if(!search_header(part->userheaders, STRCONST("Content-Disposition"))) {
1816 if(part->filename || part->name ||
1820 !part->name && !part->filename)
1826 if(part->name) {
1827 name = escape_string(data, part->name, strategy);
1831 if(!ret && part->filename) {
1832 filename = escape_string(data, part->filename, strategy);
1837 ret = Curl_mime_add_header(&part->curlheaders,
1855 ret = add_content_type(&part->curlheaders, contenttype, boundary);
1861 if(!search_header(part->userheaders,
1863 if(part->encoder)
1864 cte = part->encoder->name;
1866 part->kind != MIMEKIND_MULTIPART)
1869 ret = Curl_mime_add_header(&part->curlheaders,
1878 if(part->state.state == MIMESTATE_CURLHEADERS)
1879 mimesetstate(&part->state, MIMESTATE_CURLHEADERS, part->curlheaders);
1882 if(part->kind == MIMEKIND_MULTIPART && mime) {
1898 /* Recursively reset paused status in the given part. */
1899 void Curl_mime_unpause(curl_mimepart *part)
1901 if(part) {
1902 if(part->lastreadstatus == CURL_READFUNC_PAUSE)
1903 part->lastreadstatus = 1; /* Successful read status. */
1904 if(part->kind == MIMEKIND_MULTIPART) {
1905 curl_mime *mime = (curl_mime *) part->arg;
1939 CURLcode curl_mime_name(curl_mimepart *part, const char *name)
1941 (void) part;
1946 CURLcode curl_mime_filename(curl_mimepart *part, const char *filename)
1948 (void) part;
1953 CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype)
1955 (void) part;
1960 CURLcode curl_mime_encoder(curl_mimepart *part, const char *encoding)
1962 (void) part;
1967 CURLcode curl_mime_data(curl_mimepart *part,
1970 (void) part;
1976 CURLcode curl_mime_filedata(curl_mimepart *part, const char *filename)
1978 (void) part;
1983 CURLcode curl_mime_data_cb(curl_mimepart *part,
1990 (void) part;
1999 CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts)
2001 (void) part;
2006 CURLcode curl_mime_headers(curl_mimepart *part,
2009 (void) part;