/lib/Wildfire/Protocol/Announce.php

https://github.com/cadorn/firephp-dotcloud · PHP · 123 lines · 76 code · 21 blank · 26 comment · 24 complexity · 8d66ef736d344722e0135528c9bb4f73 MD5 · raw file

  1. <?php
  2. require_once 'Wildfire/Protocol.php';
  3. require_once 'Wildfire/Message.php';
  4. class Wildfire_Protocol_Announce extends Wildfire_Protocol
  5. {
  6. public function parse(&$buffers, &$receivers, &$senders, &$messages, $key, $value) {
  7. $parts = explode("-", $key);
  8. // parts[0] - message id/index
  9. if($parts[0]=='index') {
  10. // ignore the index header
  11. return;
  12. }
  13. // 62|...|\
  14. if(!preg_match_all('/^(\d*)?\|(.*)\|(\\\)?$/si' ,$value, $m)) {
  15. throw new Exception("Error parsing message: " . $value);
  16. }
  17. // length present and message matches length - complete message
  18. if($m[1][0] && $m[1][0]==strlen($m[2][0]) && !$m[3][0]) {
  19. $this->_parse_enqueueMessage($messages, $key, $m[2][0]);
  20. } else
  21. // message continuation present - message part
  22. if( $m[3][0] ) {
  23. $this->_parse_enqueueBuffer($buffers, $receivers, $senders, $messages, $key, $m[2][0], ($m[1][0])?'first':'part', $m[1][0]);
  24. } else
  25. // no length and no message continuation - last message part
  26. if( !$m[1][0] && !$m[3][0] ) {
  27. $this->_parse_enqueueBuffer($buffers, $receivers, $senders, $messages, $key, $m[2][0], 'last');
  28. } else {
  29. throw new Exception('Error parsing message: ' + $value);
  30. }
  31. }
  32. // this supports message parts arriving in any order as fast as possible
  33. private function _parse_enqueueBuffer(&$buffers, &$receivers, &$senders, &$messages, $index, $value, $position, $length) {
  34. $receiver = "*";
  35. if(!$buffers[$receiver]) {
  36. $buffers[$receiver] = array("firsts"=> 0, "lasts"=> 0, "messages"=> array());
  37. }
  38. if($position=="first") $buffers[$receiver]["firsts"] += 1;
  39. else if($position=="last") $buffers[$receiver]["lasts"] += 1;
  40. $buffers[$receiver]["messages"][] = array($index, $value, $position, $length);
  41. // if we have a mathching number of first and last parts we assume we have
  42. // a complete message so we try and join it
  43. if($buffers[$receiver]["firsts"]>0 && $buffers[$receiver]["firsts"]==$buffers[$receiver]["lasts"]) {
  44. // first we sort all messages
  45. /*
  46. TODO: implement
  47. $buffers[$receiver]["messages"].sort(
  48. function (a, b) {
  49. return a[0] - b[0];
  50. }
  51. );
  52. */
  53. // find the first "first" part and start collecting parts
  54. // until "last" is found
  55. $startIndex = null;
  56. $buffer = null;
  57. for( $i=0 ; $i<count($buffers[$receiver]["messages"]) ; $i++ ) {
  58. if($buffers[$receiver]["messages"][$i][2]=="first") {
  59. $startIndex = $i;
  60. $buffer = $buffers[$receiver]["messages"][$i][1];
  61. } else
  62. if($startIndex!==null) {
  63. $buffer += $buffers[$receiver]["messages"][$i][1];
  64. if($buffers[$receiver]["messages"][$i][2]=="last") {
  65. // if our buffer matches the message length
  66. // we have a complete message
  67. if(count($buffer)==$buffers[$receiver]["messages"][$startIndex][3]) {
  68. // message is complete
  69. $this->_parse_enqueueMessage($messages, $buffers[$receiver]["messages"][$startIndex][0], $buffer);
  70. array_splice($buffers[$receiver]["messages"], $startIndex, $i-$startIndex);
  71. $buffers[$receiver]["firsts"] -= 1;
  72. $buffers[$receiver]["lasts"] -= 1;
  73. if(count($buffers[$receiver]["messages"])==0) $buffers[$receiver] = null;
  74. $startIndex = null;
  75. $buffer = null;
  76. } else {
  77. // message is not complete
  78. }
  79. }
  80. }
  81. }
  82. }
  83. }
  84. private function _parse_enqueueMessage(&$messages, $index, $value) {
  85. $receiver = "*";
  86. if(!isset($messages[$receiver])) {
  87. $messages[$receiver] = array();
  88. }
  89. $message = new Wildfire_Message();
  90. $message->setReceiver($receiver);
  91. preg_match_all('/^(.*?[^\\\])?\|(.*)$/si', $value, $m);
  92. $message->setMeta($m[1][0] || null);
  93. $message->setData($m[2][0]);
  94. $messages[$receiver][] = array($index, $message);
  95. }
  96. public function encodeMessage($options, $message) {
  97. // TODO: implement
  98. }
  99. public function encodeKey($util, $receiverId, $senderId) {
  100. // TODO: implement
  101. }
  102. }