/application/third_party/firephp-1.0b1rc1/lib/Wildfire/Protocol/Announce.php

https://bitbucket.org/olivopablo/iphoto · PHP · 120 lines · 74 code · 20 blank · 26 comment · 24 complexity · 90d96c4eef8f3a350c4df5cc631aad92 MD5 · raw file

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