Home | History | Annotate | Download | only in lib

Lines Matching full:part

11  * you should have received as part of this distribution. The terms
62 curl_mimepart *part);
63 static curl_off_t encoder_nop_size(curl_mimepart *part);
65 curl_mimepart *part);
67 curl_mimepart *part);
68 static curl_off_t encoder_base64_size(curl_mimepart *part);
70 curl_mimepart *part);
71 static curl_off_t encoder_qp_size(curl_mimepart *part);
354 curl_mimepart *part)
356 mime_encoder_state *st = &part->encstate;
369 static curl_off_t encoder_nop_size(curl_mimepart *part)
371 return part->datasize;
377 curl_mimepart *part)
379 mime_encoder_state *st = &part->encstate;
400 curl_mimepart *part)
402 mime_encoder_state *st = &part->encstate;
462 if(part->easy && cursize) {
463 CURLcode result = Curl_convert_to_network(part->easy, buffer, cursize);
472 static curl_off_t encoder_base64_size(curl_mimepart *part)
474 curl_off_t size = part->datasize;
507 curl_mimepart *part)
509 mime_encoder_state *st = &part->encstate;
608 static curl_off_t encoder_qp_size(curl_mimepart *part)
612 return part->datasize? -1: 0;
617 /* Argument is a pointer to the mime part. */
621 curl_mimepart *part = (curl_mimepart *) instream;
622 size_t sz = (size_t) part->datasize - part->state.offset;
629 memcpy(buffer, (char *) &part->data[part->state.offset], sz);
631 part->state.offset += sz;
637 curl_mimepart *part = (curl_mimepart *) instream;
641 offset += part->state.offset;
644 offset += part->datasize;
648 if(offset < 0 || offset > part->datasize)
651 part->state.offset = (size_t) offset;
662 /* Argument is a pointer to the mime part. */
663 static int mime_open_file(curl_mimepart * part)
665 /* Open a MIMEKIND_FILE part. */
667 if(part->fp)
669 part->fp = fopen_read(part->data, "rb");
670 return part->fp? 0: -1;
676 curl_mimepart *part = (curl_mimepart *) instream;
678 if(mime_open_file(part))
681 return fread(buffer, size, nitems, part->fp);
686 curl_mimepart *part = (curl_mimepart *) instream;
688 if(whence == SEEK_SET && !offset && !part->fp)
691 if(mime_open_file(part))
694 return fseek(part->fp, (long) offset, whence)?
700 curl_mimepart *part = (curl_mimepart *) ptr;
702 if(part->fp) {
703 fclose(part->fp);
704 part->fp = NULL;
706 Curl_safefree(part->data);
707 part->data = NULL;
744 /* Read a non-encoded part content. */
745 static size_t read_part_content(curl_mimepart *part,
750 if(part->readfunc)
751 sz = part->readfunc(buffer, 1, bufsize, part->arg);
755 /* Read and encode part content. */
756 static size_t read_encoded_part_content(curl_mimepart *part,
759 mime_encoder_state *st = &part->encstate;
767 sz = part->encoder->encodefunc(buffer, bufsize, ateof, part);
796 sz = read_part_content(part, st->buf + st->bufend,
815 /* Readback a mime part. */
816 static size_t readback_part(curl_mimepart *part,
826 /* Readback from part. */
830 hdr = (struct curl_slist *) part->state.ptr;
831 switch(part->state.state) {
833 mimesetstate(&part->state, part->flags & MIME_BODY_ONLY? MIMESTATE_BODY:
834 MIMESTATE_CURLHEADERS, part->curlheaders);
838 mimesetstate(&part->state, MIMESTATE_EOH, NULL);
842 mimesetstate(&part->state, MIMESTATE_USERHEADERS, hdr->next);
848 mimesetstate(&part->state, MIMESTATE_USERHEADERS, part->userheaders);
850 sz = readback_bytes(&part->state, buffer, bufsize,
853 mimesetstate(&part->state, part->state.state, hdr->next);
857 sz = readback_bytes(&part->state, buffer, bufsize, "\r\n", 2, "");
859 mimesetstate(&part->state, MIMESTATE_BODY, NULL);
863 if(part->easy && convbuf < buffer) {
864 CURLcode result = Curl_convert_to_network(part->easy, convbuf,
871 cleanup_encoder_state(&part->encstate);
872 mimesetstate(&part->state, MIMESTATE_CONTENT, NULL);
875 if(part->encoder)
876 sz = read_encoded_part_content(part, buffer, bufsize);
878 sz = read_part_content(part, buffer, bufsize);
881 mimesetstate(&part->state, MIMESTATE_END, NULL);
883 if(part->kind == MIMEKIND_FILE && part->fp) {
884 fclose(part->fp);
885 part->fp = NULL;
897 break; /* Other values not in part state. */
907 if(part->easy && convbuf < buffer &&
908 part->state.state < MIMESTATE_BODY) {
909 CURLcode result = Curl_convert_to_network(part->easy, convbuf,
926 curl_mimepart *part;
935 part = mime->state.ptr;
951 mimesetstate(&mime->state, MIMESTATE_BOUNDARY2, part);
955 strlen(mime->boundary), part? "\r\n": "--\r\n");
966 mimesetstate(&mime->state, MIMESTATE_CONTENT, part);
970 if(!part) {
974 sz = readback_part(part, buffer, nitems);
984 mimesetstate(&mime->state, MIMESTATE_BOUNDARY1, part->nextpart);
1013 static int mime_part_rewind(curl_mimepart *part)
1018 if(part->flags & MIME_BODY_ONLY)
1020 cleanup_encoder_state(&part->encstate);
1021 if(part->state.state > targetstate) {
1023 if(part->seekfunc) {
1024 res = part->seekfunc(part->arg, (curl_off_t) 0, SEEK_SET);
1041 mimesetstate(&part->state, targetstate, NULL);
1049 curl_mimepart *part;
1059 for(part = mime->firstpart; part; part = part->nextpart) {
1060 res = mime_part_rewind(part);
1071 /* Release part content. */
1072 static void cleanup_part_content(curl_mimepart *part)
1074 if(part->freefunc)
1075 part->freefunc(part->arg);
1077 part->readfunc = NULL;
1078 part->seekfunc = NULL;
1079 part->freefunc = NULL;
1080 part->arg = (void *) part; /* Defaults to part itself. */
1081 part->data = NULL;
1082 part->fp = NULL;
1083 part->datasize = (curl_off_t) 0; /* No size yet. */
1084 cleanup_encoder_state(&part->encstate);
1085 part->kind = MIMEKIND_NONE;
1094 cleanup_part_content(mime->parent); /* Avoid dangling pointer in part. */
1106 cleanup_part_content(mime->parent); /* Avoid dangling pointer in part. */
1112 void Curl_mime_cleanpart(curl_mimepart *part)
1114 cleanup_part_content(part);
1115 curl_slist_free_all(part->curlheaders);
1116 if(part->flags & MIME_USERHEADERS_OWNER)
1117 curl_slist_free_all(part->userheaders);
1118 Curl_safefree(part->mimetype);
1119 Curl_safefree(part->name);
1120 Curl_safefree(part->filename);
1121 Curl_mime_initpart(part, part->easy);
1127 curl_mimepart *part;
1132 part = mime->firstpart;
1133 mime->firstpart = part->nextpart;
1134 Curl_mime_cleanpart(part);
1135 free(part);
1169 to the part. */
1232 /* Get a part boundary. */
1248 /* Initialize a mime part. */
1249 void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy)
1251 memset((char *) part, 0, sizeof *part);
1252 part->easy = easy;
1253 mimesetstate(&part->state, MIMESTATE_BEGIN, NULL);
1256 /* Create a mime part and append it to a mime handle's part list. */
1259 curl_mimepart *part;
1264 part = (curl_mimepart *) malloc(sizeof *part);
1266 if(part) {
1267 Curl_mime_initpart(part, mime->easy);
1268 part->parent = mime;
1271 mime->lastpart->nextpart = part;
1273 mime->firstpart = part;
1275 mime->lastpart = part;
1278 return part;
1281 /* Set mime part name. */
1282 CURLcode curl_mime_name(curl_mimepart *part, const char *name)
1284 if(!part)
1287 Curl_safefree(part->name);
1288 part->name = NULL;
1291 part->name = strdup(name);
1292 if(!part->name)
1299 /* Set mime part remote file name. */
1300 CURLcode curl_mime_filename(curl_mimepart *part, const char *filename)
1302 if(!part)
1305 Curl_safefree(part->filename);
1306 part->filename = NULL;
1309 part->filename = strdup(filename);
1310 if(!part->filename)
1317 /* Set mime part content from memory data. */
1318 CURLcode curl_mime_data(curl_mimepart *part,
1321 if(!part)
1324 cleanup_part_content(part);
1330 part->data = malloc(datasize + 1);
1331 if(!part->data)
1334 part->datasize = datasize;
1337 memcpy(part->data, data, datasize);
1338 part->data[datasize] = '\0'; /* Set a nul terminator as sentinel. */
1340 part->readfunc = mime_mem_read;
1341 part->seekfunc = mime_mem_seek;
1342 part->freefunc = mime_mem_free;
1343 part->kind = MIMEKIND_DATA;
1349 /* Set mime part content from named local file. */
1350 CURLcode curl_mime_filedata(curl_mimepart *part, const char *filename)
1355 if(!part)
1358 cleanup_part_content(part);
1366 part->data = strdup(filename);
1367 if(!part->data)
1370 part->datasize = -1;
1372 part->datasize = filesize(filename, sbuf);
1373 part->seekfunc = mime_file_seek;
1376 part->readfunc = mime_file_read;
1377 part->freefunc = mime_file_free;
1378 part->kind = MIMEKIND_FILE;
1388 CURLcode res = curl_mime_filename(part, base);
1398 /* Set mime part type. */
1399 CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype)
1401 if(!part)
1404 Curl_safefree(part->mimetype);
1405 part->mimetype = NULL;
1408 part->mimetype = strdup(mimetype);
1409 if(!part->mimetype)
1417 CURLcode curl_mime_encoder(curl_mimepart *part, const char *encoding)
1422 if(!part)
1425 part->encoder = NULL;
1432 part->encoder = mep;
1439 /* Set mime part headers. */
1440 CURLcode curl_mime_headers(curl_mimepart *part,
1443 if(!part)
1446 if(part->flags & MIME_USERHEADERS_OWNER) {
1447 if(part->userheaders != headers) /* Allow setting twice the same list. */
1448 curl_slist_free_all(part->userheaders);
1449 part->flags &= ~MIME_USERHEADERS_OWNER;
1451 part->userheaders = headers;
1453 part->flags |= MIME_USERHEADERS_OWNER;
1457 /* Set mime part content from callback. */
1458 CURLcode curl_mime_data_cb(curl_mimepart *part, curl_off_t datasize,
1463 if(!part)
1466 cleanup_part_content(part);
1469 part->readfunc = readfunc;
1470 part->seekfunc = seekfunc;
1471 part->freefunc = freefunc;
1472 part->arg = arg;
1473 part->datasize = datasize;
1474 part->kind = MIMEKIND_CALLBACK;
1480 /* Set mime part content from subparts. */
1481 CURLcode Curl_mime_set_subparts(curl_mimepart *part,
1486 if(!part)
1490 if(part->kind == MIMEKIND_MULTIPART && part->arg == subparts)
1493 cleanup_part_content(part);
1497 if(part->easy && subparts->easy && part->easy != subparts->easy)
1504 /* Should not be the part's root. */
1505 root = part->parent;
1510 if(part->easy)
1511 failf(part->easy, "Can't add itself as a subpart!");
1516 subparts->parent = part;
1517 part->readfunc = mime_subparts_read;
1518 part->seekfunc = mime_subparts_seek;
1519 part->freefunc = take_ownership? mime_subparts_free: mime_subparts_unbind;
1520 part->arg = subparts;
1521 part->datasize = -1;
1522 part->kind = MIMEKIND_MULTIPART;
1528 CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts)
1530 return Curl_mime_set_subparts(part, subparts, TRUE);
1535 /* Argument is the dummy top part. */
1538 curl_mimepart *part = (curl_mimepart *) instream;
1541 return readback_part(part, buffer, nitems);
1545 CURLcode Curl_mime_rewind(curl_mimepart *part)
1547 return mime_part_rewind(part) == CURL_SEEKFUNC_OK?
1570 curl_mimepart *part;
1578 for(part = mime->firstpart; part; part = part->nextpart) {
1579 sz = Curl_mime_size(part);
1592 curl_off_t Curl_mime_size(curl_mimepart *part)
1596 if(part->kind == MIMEKIND_MULTIPART)
1597 part->datasize = multipart_size(part->arg);
1599 size = part->datasize;
1601 if(part->encoder)
1602 size = part->encoder->sizefunc(part);
1604 if(size >= 0 && !(part->flags & MIME_BODY_ONLY)) {
1605 /* Compute total part size. */
1606 size += slist_size(part->curlheaders, 2, NULL);
1607 size += slist_size(part->userheaders, 2, "Content-Type");
1685 CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
1697 curl_slist_free_all(part->curlheaders);
1698 part->curlheaders = NULL;
1701 if(part->state.state == MIMESTATE_CURLHEADERS)
1702 mimesetstate(&part->state, MIMESTATE_CURLHEADERS, NULL);
1705 customct = part->mimetype;
1707 customct = search_header(part->userheaders, "Content-Type");
1713 switch(part->kind) {
1718 contenttype = ContentTypeForFilename(part->filename);
1720 contenttype = ContentTypeForFilename(part->data);
1721 if(!contenttype && part->filename)
1725 contenttype = ContentTypeForFilename(part->filename);
1730 if(part->kind == MIMEKIND_MULTIPART) {
1731 mime = (curl_mime *) part->arg;
1737 if(strategy == MIMESTRATEGY_MAIL || !part->filename)
1741 if(!search_header(part->userheaders, "Content-Disposition")) {
1743 if(part->filename || part->name ||
1747 !part->name && !part->filename)
1753 if(part->name) {
1754 name = escape_string(part->name);
1758 if(!ret && part->filename) {
1759 filename = escape_string(part->filename);
1764 ret = Curl_mime_add_header(&part->curlheaders,
1782 ret = add_content_type(&part->curlheaders, contenttype, boundary);
1788 if(!search_header(part->userheaders, "Content-Transfer-Encoding")) {
1789 if(part->encoder)
1790 cte = part->encoder->name;
1792 part->kind != MIMEKIND_MULTIPART)
1795 ret = Curl_mime_add_header(&part->curlheaders,
1804 if(part->state.state == MIMESTATE_CURLHEADERS)
1805 mimesetstate(&part->state, MIMESTATE_CURLHEADERS, part->curlheaders);
1808 if(part->kind == MIMEKIND_MULTIPART && mime) {
1843 CURLcode curl_mime_name(curl_mimepart *part, const char *name)
1845 (void) part;
1850 CURLcode curl_mime_filename(curl_mimepart *part, const char *filename)
1852 (void) part;
1857 CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype)
1859 (void) part;
1864 CURLcode curl_mime_encoder(curl_mimepart *part, const char *encoding)
1866 (void) part;
1871 CURLcode curl_mime_data(curl_mimepart *part,
1874 (void) part;
1880 CURLcode curl_mime_filedata(curl_mimepart *part, const char *filename)
1882 (void) part;
1887 CURLcode curl_mime_data_cb(curl_mimepart *part,
1894 (void) part;
1903 CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts)
1905 (void) part;
1910 CURLcode curl_mime_headers(curl_mimepart *part,
1913 (void) part;
1919 void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy)
1921 (void) part;
1925 void Curl_mime_cleanpart(curl_mimepart *part)
1927 (void) part;
1937 CURLcode Curl_mime_set_subparts(curl_mimepart *part,
1940 (void) part;
1946 CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
1951 (void) part;
1958 curl_off_t Curl_mime_size(curl_mimepart *part)
1960 (void) part;
1973 CURLcode Curl_mime_rewind(curl_mimepart *part)
1975 (void) part;