/** * Usage: * <code> * $ack = new Net_HL7_Messages_ACK($request); * </code> * * Convenience module implementing an acknowledgement (ACK) message. This * can be used in HL7 servers to create an acknowledgement for an * incoming message. * * @version 0.10 * @author D.A.Dokter <*****@*****.**> * @access public * @category Networking * @package Net_HL7 * @license http://www.php.net/license/3_0.txt PHP License 3.0 */ public function __construct($req = "", $reqMsh = null) { parent::__construct(); if ($req) { $msh = $req->getSegmentByIndex(0); if ($msh) { $msh = new Net_HL7_Segments_MSH($msh->getFields(1)); } else { $msh = new Net_HL7_Segments_MSH(); } } else { $msh = new Net_HL7_Segments_MSH(); } $msa = new Net_HL7_Segment("MSA"); // Determine acknowledge mode: normal or enhanced // if ($req && ($msh->getField(15) || $msh->getField(16))) { $this->_ACK_TYPE = "E"; $msa->setField(1, "CA"); } else { $this->_ACK_TYPE = "N"; $msa->setField(1, "AA"); } $this->addSegment($msh); $this->addSegment($msa); $msh->setField(9, "ACK"); // Construct an ACK based on the request if ($req && $reqMsh) { $msh->setField(3, $reqMsh->getField(5)); $msh->setField(4, $reqMsh->getField(6)); $msh->setField(5, $reqMsh->getField(3)); $msh->setField(6, $reqMsh->getField(4)); $msa->setField(2, $reqMsh->getField(10)); } }
public function test() { # Basic stuff # $hl7 = new Net_HL7(); $seg = new Net_HL7_Segment("PID"); $seg->setField(0, "XXX"); $seg->setField(3, "XXX"); $this->assertTrue($seg->getField(0) == "PID", "Field 0 is PID"); $this->assertTrue($seg->getName() == "PID", "Segment name is PID"); $this->assertTrue($seg->getField(3) == "XXX", "Field 3 is XXX"); # Try faulty constructors # //$this->assertTrue(! defined(new Net::HL7::Segment()), "Segment constructor with no name"); //$this->assertTrue(! defined( new Net::HL7::Segment("XXXX")), "Segment constructor with 4 char name"); //$this->assertTrue(! defined(new Net::HL7::Segment("xxx")), "Segment constructor with lowercase name"); $seg = new Net_HL7_Segment("DG1", array(4, 3, 2, array(1, 2, 3), 0)); $this->assertTrue($seg->getField(3) == "2", "Constructor with array ref"); $comps = $seg->getField(4); $this->assertTrue($comps[2] == "3", "Constructor with array ref for composed fields"); # Field setters/getters # $seg = new Net_HL7_Segment("DG1"); $seg->setField(3, array(1, 2, 3)); $seg->setField(8, $hl7->getNull()); $this->assertTrue(is_array($seg->getField(3)), "Composed field 1^2^3"); $this->assertTrue($seg->getField(8) == "\"\"" && $seg->getField(8) == $hl7->getNull(), "HL7 NULL value"); $subFields = $seg->getField(3); $this->assertTrue(count($subFields) == 3, "Getting composed fields as array"); $this->assertTrue($subFields[1] == "2", "Getting single value from composed field"); $flds = $seg->getFields(); $this->assertTrue(count($flds) == 9, "Number of fields in segment"); $flds = $seg->getFields(2); $this->assertTrue(count($flds) == 7, "Getting all fields from 2nd index"); $flds = $seg->getFields(2, 4); $this->assertTrue(count($flds) == 3, "Getting fields from 2 till 4"); $seg->setField(12); $this->assertTrue($seg->size() == 8, "Size operator"); $seg->setField(12, "x"); $this->assertTrue($seg->size() == 12, "Size operator"); }
public function test() { # Simple constructor # $msg = new Net_HL7_Message(); $seg1 = new Net_HL7_Segment("PID"); $seg1->setField(2, "Foo"); $msg->addSegment(new Net_HL7_Segments_MSH()); $msg->addSegment($seg1); $seg0 = $msg->getSegmentByIndex(0); $seg1 = $msg->getSegmentByIndex(1); $seg0->setField(3, "XXX"); $this->assertTrue($seg0->getName() == "MSH", "Segment 0 name MSH"); $this->assertTrue($seg1->getName() == "PID", "Segment 1 name PID"); $this->assertTrue($seg0->getField(3) == "XXX", "3d field of MSH"); $this->assertTrue($seg1->getField(2) == "Foo", "2nd field of PID"); // Check references $segX = $msg->getSegmentByIndex(0); $this->assertTrue($segX->getField(3) == "XXX", "3d field of MSH"); $msg = new Net_HL7_Message("MSH|^~\\&|1|\rPID|||xxx|\r"); $seg0 = $msg->getSegmentByIndex(0); $this->assertTrue($msg->toString() == "MSH|^~\\&|1|\rPID|||xxx|\r", "String representation of message"); $this->assertTrue($msg->toString(1) == "MSH|^~\\&|1|\nPID|||xxx|\n", "Pretty print representation of message"); $this->assertTrue($seg0->getField(2) == "^~\\&", "Encoding characters (MSH(2))"); # Constructor with components and subcomponents # $msg = new Net_HL7_Message("MSH|^~\\&|1|\rPID|||xx^x&y&z^yy^zz|\r"); $seg1 = $msg->getSegmentByIndex(1); $comps = $seg1->getField(3); $this->assertTrue($comps[0] == "xx", "Composed field"); $this->assertTrue($comps[1][1] == "y", "Subcomposed field"); # Trying different field separator # $msg = new Net_HL7_Message("MSH*^~\\&*1\rPID***xxx\r"); $this->assertTrue($msg->toString() == "MSH*^~\\&*1*\rPID***xxx*\r", "String representation of message with * as field separator"); $seg0 = $msg->getSegmentByIndex(0); $this->assertTrue($seg0->getField(3) == "1", "3d field of MSH"); # Trying different field sep and control chars # $msg = new Net_HL7_Message("MSH*.%#@*1\rPID***x.x@y@z.z\r"); $seg1 = $msg->getSegmentByIndex(1); $comps = $seg1->getField(3); $this->assertTrue($comps[0] == "x", "Composed field with . as separator"); $this->assertTrue($comps[1][1] == "y", "Subcomposed field with @ as separator"); # Faulty constuctor # //$this->assertTrue(! defined(new Net::HL7::Message("MSH|^~\\&*1\rPID|||xxx\r")), "Field separator not repeated"); $seg2 = new Net_HL7_Segment("XXX"); $msg->addSegment($seg2); $msg->removeSegmentByIndex(1); $seg1 = $msg->getSegmentByIndex(1); $this->assertTrue($seg1->getName() == $seg2->getName(), "Add/remove segment"); $seg3 = new Net_HL7_Segment("YYY"); $seg4 = new Net_HL7_Segment("ZZZ"); $msg->insertSegment($seg3, 1); $msg->insertSegment($seg4, 1); $seg3 = $msg->getSegmentByIndex(3); $seg4 = $msg->getSegmentByIndex(4); $this->assertTrue($seg3->getName() == $seg2->getName(), "Insert segment"); $msg->removeSegmentByIndex(1); $msg->removeSegmentByIndex(1); $msg->removeSegmentByIndex(6); $seg5 = new Net_HL7_Segment("ZZ1"); # This shouldn't be possible @$msg->insertSegment($seg5, 3); $this->assertTrue(!$msg->getSegmentByIndex(3), "Erroneous insert"); $msg->insertSegment($seg5, 2); $seg2 = $msg->getSegmentByIndex(2); $this->assertTrue($seg2->getName() == $seg5->getName(), "Insert segment"); $msg->setSegment($seg3, 2); $seg2 = $msg->getSegmentByIndex(2); $this->assertTrue($seg2->getName() == $seg3->getName(), "Set segment"); $this->assertTrue(count($msg->getSegmentsByName("MSH")) == 1, "Number of MSH segments"); $msh2 = new Net_HL7_Segments_MSH(); $msg->addSegment($msh2); $this->assertTrue(count($msg->getSegmentsByName("MSH")) == 2, "Added MSH segment, now two in message"); # Fumble 'round with ctrl chars # $msg = new Net_HL7_Message(); $msh = new Net_HL7_Segments_MSH(array()); $msh->setField(1, "*"); $msh->setField(2, "abcd"); $msg->addSegment($msh); $this->assertTrue($msg->toString() == "MSH*abcd*\r", "Creating separate MSH"); $msh->setField(1, "|"); $msh->setField(2, "^~\\&"); $this->assertTrue($msg->toString() == "MSH|^~\\&|\r", "Change MSH after add"); $msh = new Net_HL7_Segments_MSH(array()); $msh->setField(1, "*"); $msh->setField(2, "abcd"); $msg->setSegment($msh, 0); $this->assertTrue($msg->toString() == "MSH*abcd*\r", "New MSH with setSegment"); $str = 'MSH|^~\\&|CodeRyte HL7|CodeRyte HQ|VISION|MISYS|200404061744||DFT^P03|TC-2743|P^T|2.3|||AL|NE||ASCII||| |'; $msg = new Net_HL7_Message($str); $this->assertTrue($msg->toString(1) == "{$str}\n", "Message from string and to string with subcomponents"); // Segment as string $msg = new Net_HL7_Message("MSH*^~\\&*1\rPID*a^b^c*a^b1&b2^c*xxx\r"); $xxx = new Net_HL7_Segment("XXX"); $xxx->setField(2, array("a", array("b1", "b2"), "c")); $msg->addSegment($xxx); $this->assertTrue($msg->getSegmentAsString(0) == "MSH*^~\\&*1*", "MSH segment as string"); $this->assertTrue($msg->getSegmentAsString(1) == "PID*a^b^c*a^b1&b2^c*xxx*", "PID segment as string"); $this->assertTrue($msg->getSegmentAsString(2) == "XXX**a^b1&b2^c*", "XXX segment as string"); // Get segment field as string $this->assertTrue($msg->getSegmentFieldAsString(0, 3) == "1", "MSH(3) as string"); $this->assertTrue($msg->getSegmentFieldAsString(1, 2) == "a^b1&b2^c", "PID(2) as string"); }
<?php require_once "Net/HL7/Segments/MSH.php"; require_once "Net/HL7/Message.php"; require_once "Net/HL7/Connection.php"; require_once "test_base.php"; $msg = new Net_HL7_Message(); $msg->addSegment(new Net_HL7_Segments_MSH()); $seg1 = new Net_HL7_Segment("PID"); $seg1->setField(3, "XXX"); $msg->addSegment($seg1); /** // If you have fork support, try this... $pid = pcntl_fork(); if (! $pid) { // Server process set_time_limit(0); // Turn on implicit output flushing so we see what we're getting // as it comes in. ob_implicit_flush(); if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n"; } if (($ret = socket_bind($sock, "localhost", 12011)) < 0) { echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
ok(count($msg->getSegmentsByName("MSH")) == 2, "Added MSH segment, now two in message<br>"); # Fumble 'round with ctrl chars # $msg = new Net_HL7_Message(); $msh = new Net_HL7_Segments_MSH(array()); $msh->setField(1, "*"); $msh->setField(2, "abcd"); $msg->addSegment($msh); ok($msg->toString() == "MSH*abcd*\r", "Creating separate MSH<br>"); $msh->setField(1, "|"); $msh->setField(2, "^~\\&"); ok($msg->toString() == "MSH|^~\\&|\r", "Change MSH after add<br>"); $msh = new Net_HL7_Segments_MSH(array()); $msh->setField(1, "*"); $msh->setField(2, "abcd"); $msg->setSegment($msh, 0); ok($msg->toString() == "MSH*abcd*\r", "New MSH with setSegment<br>"); $str = 'MSH|^~\\&|CodeRyte HL7|CodeRyte HQ|VISION|MISYS|200404061744||DFT^P03|TC-2743|P^T|2.3|||AL|NE||ASCII||| |'; $msg = new Net_HL7_Message($str); ok($msg->toString(1) == "{$str}\n", "Message from string and to string with subcomponents<br>"); // Segment as string $msg = new Net_HL7_Message("MSH*^~\\&*1\rPID*a^b^c*a^b1&b2^c*xxx\r"); $xxx = new Net_HL7_Segment("XXX"); $xxx->setField(2, array("a", array("b1", "b2"), "c")); $msg->addSegment($xxx); ok($msg->getSegmentAsString(0) == "MSH*^~\\&*1*", "MSH segment as string<br>"); ok($msg->getSegmentAsString(1) == "PID*a^b^c*a^b1&b2^c*xxx*", "PID segment as string<br>"); ok($msg->getSegmentAsString(2) == "XXX**a^b1&b2^c*", "XXX segment as string<br>"); // Get segment field as string ok($msg->getSegmentFieldAsString(0, 3) == "1", "MSH(3) as string<br>"); ok($msg->getSegmentFieldAsString(1, 2) == "a^b1&b2^c", "PID(2) as string<br>");
public function test() { $msg = new Net_HL7_Message(); $msg->addSegment(new Net_HL7_Segments_MSH()); $seg1 = new Net_HL7_Segment("PID"); $seg1->setField(3, "XXX"); $msg->addSegment($seg1); /** // If you have fork support, try this... $pid = pcntl_fork(); if (! $pid) { // Server process set_time_limit(0); // Turn on implicit output flushing so we see what we're getting // as it comes in. ob_implicit_flush(); if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n"; } if (($ret = socket_bind($sock, "localhost", 12011)) < 0) { echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n"; } if (($ret = socket_listen($sock, 5)) < 0) { echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n"; } do { if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } if (false === ($buf = socket_read($msgsock, 8192, PHP_NORMAL_READ))) { echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n"; break 2; } echo "Incoming: $buf\n"; $msg = new Net_HL7_Message($buf); $ack = new Net_HL7_Messages_ACK($msg); socket_write($msgsock, "\013" . $ack->toString() . "\034\015", strlen($ack->toString() + 3)); echo "Said: " . $ack->toString(1) . "\n"; } while (true); socket_close($msgsock); exit; } */ $socket = $this->getMock('Net_Socket'); $socket->expects($this->once())->method('write')->with("\v" . $msg->toString() . "\r"); $socket->expects($this->once())->method('read')->will($this->returnValue("MSH*^~\\&*1\rPID***xxx\r" . "\r")); $conn = new Net_HL7_Connection($socket); $resp = $conn->send($msg); $this->assertTrue($resp instanceof Net_HL7_Message); }
/** * Set the field specified by index to value. * * Indices start at 1, to stay with the HL7 standard. Trying to * set the value at index 0 has no effect. Setting the value on * index 1, will effectively change the value of FIELD_SEPARATOR * for the message containing this segment, if the value has * length 1; setting the field on index 2 will change the values * of COMPONENT_SEPARATOR, REPETITION_SEPARATOR, ESCAPE_CHARACTER * and SUBCOMPONENT_SEPARATOR for the message, if the string is of * length 4. * * @param int Index of field * @param mixed Value * @return boolean * @access public */ function setField($index, $value) { if ($index == 1) { if (strlen($value) != 1) { return false; } } if ($index == 2) { if (strlen($value) != 4) { return false; } } return parent::setField($index, $value); }
ok($seg->getField(0) == "PID", "Field 0 is PID<br>"); ok($seg->getName() == "PID", "Segment name is PID<br>"); ok($seg->getField(3) == "XXX", "Field 3 is XXX<br>"); # Try faulty constructors # //ok(! defined(new Net::HL7::Segment()), "Segment constructor with no name"); //ok(! defined( new Net::HL7::Segment("XXXX")), "Segment constructor with 4 char name"); //ok(! defined(new Net::HL7::Segment("xxx")), "Segment constructor with lowercase name"); $seg = new Net_HL7_Segment("DG1", array(4, 3, 2, array(1, 2, 3), 0)); ok($seg->getField(3) == "2", "Constructor with array ref<br>"); $comps = $seg->getField(4); ok($comps[2] == "3", "Constructor with array ref for composed fields<br>"); # Field setters/getters # $seg = new Net_HL7_Segment("DG1"); $seg->setField(3, array(1, 2, 3)); $seg->setField(8, $hl7->getNull()); ok(is_array($seg->getField(3)), "Composed field 1^2^3<br>"); ok($seg->getField(8) == "\"\"" && $seg->getField(8) == $hl7->getNull(), "HL7 NULL value<br>"); $subFields = $seg->getField(3); ok(count($subFields) == 3, "Getting composed fields as array<br>"); ok($subFields[1] == "2", "Getting single value from composed field<br>"); $flds = $seg->getFields(); ok(count($flds) == 9, "Number of fields in segment<br>"); $flds = $seg->getFields(2); ok(count($flds) == 7, "Getting all fields from 2nd index<br>"); $flds = $seg->getFields(2, 4); ok(count($flds) == 3, "Getting fields from 2 till 4<br>"); $seg->setField(12); ok($seg->size() == 8, "Size operator<br>"); $seg->setField(12, "x");