QpContentEncoder.php 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. /*
  3. * This file is part of SwiftMailer.
  4. * (c) 2004-2009 Chris Corbyn
  5. *
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. /**
  10. * Handles Quoted Printable (QP) Transfer Encoding in Swift Mailer.
  11. * @package Swift
  12. * @subpackage Mime
  13. * @author Chris Corbyn
  14. */
  15. class Swift_Mime_ContentEncoder_QpContentEncoder extends Swift_Encoder_QpEncoder
  16. implements Swift_Mime_ContentEncoder
  17. {
  18. /**
  19. * Creates a new QpContentEncoder for the given CharacterStream.
  20. * @param Swift_CharacterStream $charStream to use for reading characters
  21. * @param Swift_StreamFilter $filter if canonicalization should occur
  22. * @param boolean $dotEscape if dot stuffing workaround must be enabled
  23. */
  24. public function __construct(Swift_CharacterStream $charStream,
  25. Swift_StreamFilter $filter = null, $dotEscape=false)
  26. {
  27. parent::__construct($charStream, $filter);
  28. if ($dotEscape) {
  29. /* Encode . as =2e for buggy remote servers */
  30. unset($this->_safeMap[0x2e]);
  31. }
  32. }
  33. /**
  34. * Encode stream $in to stream $out.
  35. * QP encoded strings have a maximum line length of 76 characters.
  36. * If the first line needs to be shorter, indicate the difference with
  37. * $firstLineOffset.
  38. * @param Swift_OutputByteStream $os output stream
  39. * @param Swift_InputByteStream $is input stream
  40. * @param int $firstLineOffset
  41. * @param int $maxLineLength
  42. */
  43. public function encodeByteStream(
  44. Swift_OutputByteStream $os, Swift_InputByteStream $is, $firstLineOffset = 0,
  45. $maxLineLength = 0)
  46. {
  47. if ($maxLineLength > 76 || $maxLineLength <= 0)
  48. {
  49. $maxLineLength = 76;
  50. }
  51. $thisLineLength = $maxLineLength - $firstLineOffset;
  52. $this->_charStream->flushContents();
  53. $this->_charStream->importByteStream($os);
  54. $currentLine = '';
  55. $prepend = '';
  56. $size=$lineLen=0;
  57. while (false !== $bytes = $this->_nextSequence())
  58. {
  59. //If we're filtering the input
  60. if (isset($this->_filter))
  61. {
  62. //If we can't filter because we need more bytes
  63. while ($this->_filter->shouldBuffer($bytes))
  64. {
  65. //Then collect bytes into the buffer
  66. if (false === $moreBytes = $this->_nextSequence(1))
  67. {
  68. break;
  69. }
  70. foreach ($moreBytes as $b)
  71. {
  72. $bytes[] = $b;
  73. }
  74. }
  75. //And filter them
  76. $bytes = $this->_filter->filter($bytes);
  77. }
  78. $enc = $this->_encodeByteSequence($bytes, $size);
  79. if ($currentLine && $lineLen+$size >= $thisLineLength)
  80. {
  81. $is->write($prepend . $this->_standardize($currentLine));
  82. $currentLine = '';
  83. $prepend = "=\r\n";
  84. $thisLineLength = $maxLineLength;
  85. $lineLen=0;
  86. }
  87. $lineLen+=$size;
  88. $currentLine .= $enc;
  89. }
  90. if (strlen($currentLine))
  91. {
  92. $is->write($prepend . $this->_standardize($currentLine));
  93. }
  94. }
  95. /**
  96. * Get the name of this encoding scheme.
  97. * Returns the string 'quoted-printable'.
  98. * @return string
  99. */
  100. public function getName()
  101. {
  102. return 'quoted-printable';
  103. }
  104. }