libetpan - fdik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.1 KiB

  1. /*
  2. * libEtPan! -- a mail stuff library
  3. *
  4. * Copyright (C) 2001, 2005 - DINH Viet Hoa
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. Neither the name of the libEtPan! project nor the names of its
  16. * contributors may be used to endorse or promote products derived
  17. * from this software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
  23. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. * SUCH DAMAGE.
  30. */
  31. #include "mailimap_compress.h"
  32. #include "mailimap.h"
  33. #include "mailimap_sender.h"
  34. #include "mailstream_compress.h"
  35. int mailimap_compress(mailimap * session)
  36. {
  37. struct mailimap_response * response;
  38. int r;
  39. int res;
  40. int error_code;
  41. mailstream_low * compressed_stream;
  42. mailstream_low * low;
  43. r = mailimap_send_current_tag(session);
  44. if (r != MAILIMAP_NO_ERROR) {
  45. res = r;
  46. goto err;
  47. }
  48. r = mailimap_token_send(session->imap_stream, "COMPRESS DEFLATE");
  49. if (r != MAILIMAP_NO_ERROR) {
  50. res = r;
  51. goto err;
  52. }
  53. r = mailimap_crlf_send(session->imap_stream);
  54. if (r != MAILIMAP_NO_ERROR) {
  55. res = r;
  56. goto err;
  57. }
  58. if (mailstream_flush(session->imap_stream) == -1) {
  59. res = MAILIMAP_ERROR_STREAM;
  60. goto err;
  61. }
  62. if (mailimap_read_line(session) == NULL) {
  63. res = MAILIMAP_ERROR_STREAM;
  64. goto err;
  65. }
  66. r = mailimap_parse_response(session, &response);
  67. if (r != MAILIMAP_NO_ERROR) {
  68. res = r;
  69. goto err;
  70. }
  71. error_code = response->rsp_resp_done->rsp_data.rsp_tagged->rsp_cond_state->rsp_type;
  72. mailimap_response_free(response);
  73. if (error_code != MAILIMAP_RESP_COND_STATE_OK) {
  74. res = MAILIMAP_ERROR_EXTENSION;
  75. goto err;
  76. }
  77. low = mailstream_get_low(session->imap_stream);
  78. compressed_stream = mailstream_low_compress_open(low);
  79. if (compressed_stream == NULL) {
  80. res = MAILIMAP_ERROR_STREAM;
  81. goto err;
  82. }
  83. mailstream_set_low(session->imap_stream, compressed_stream);
  84. return MAILIMAP_NO_ERROR;
  85. err:
  86. return res;
  87. }