/**
  * Decode the messages
  * 
  * @return null
  */
 function loadMessages()
 {
     $this->loadRefDicomExchange();
     if ($this->_ref_dicom_exchange) {
         $this->_ref_dicom_exchange->decodeContent();
     }
     $this->_messages = array();
     $msg_array = explode('|', $this->messages);
     foreach ($msg_array as $msg) {
         $msg = explode('\\', $msg);
         $pdu = CDicomPDUFactory::decodePDU(base64_decode($msg[1]));
         $this->_messages[$msg[0]] = $pdu;
         if ($msg[0] == "A-Associate-AC" && $this->_ref_dicom_exchange) {
             $i = 1;
             foreach ($this->_ref_dicom_exchange->_requests as $_request) {
                 $name = "{$_request->type_str}-RQ{$i}";
                 $this->_messages[$name] = $_request;
                 $i++;
             }
             $i = 1;
             foreach ($this->_ref_dicom_exchange->_responses as $_response) {
                 $name = "{$_response->type_str}-RSP{$i}";
                 $this->_messages[$name] = $_response;
                 $i++;
             }
         }
     }
 }
 /**
  * Handle a message, and return the response
  * 
  * @param CExchangeDicom $data_format The dicom exchange
  * 
  * @return array
  */
 function event(CExchangeDicom $data_format)
 {
     $dicom_exchange = new CExchangeDicom();
     if ($data_format->_exchange_id) {
         $old_requests = $data_format->_requests;
         $pres_contexts = $data_format->_presentation_contexts;
         $dicom_exchange->load($data_format->_exchange_id);
         $dicom_exchange->decodeContent();
         $dicom_exchange->_presentation_contexts = $pres_contexts;
         $dicom_exchange->_requests = array_merge($dicom_exchange->_requests, $old_requests);
     } else {
         $dicom_exchange = $data_format;
         $dicom_exchange->date_production = CMbDT::dateTime();
         $dicom_exchange->date_echange = CMbDT::dateTime();
     }
     $last_pdvs = $dicom_exchange->_requests[count($dicom_exchange->_requests) - 1]->getPDVs();
     $response = array();
     $time_deb_pdv = microtime(true);
     foreach ($last_pdvs as $last_pdv) {
         if ($last_pdv->getMessageControlHeader() == 0 || $last_pdv->getMessageControlHeader() == 2) {
             $find_rq_pdv = null;
             if (count($last_pdvs) > 1) {
                 $find_rq_pdv = $last_pdvs[0];
             } else {
                 for ($i = count($dicom_exchange->_requests) - 2; $i >= 0; $i--) {
                     $_pdv = $dicom_exchange->_requests[$i]->getPDV(0);
                     if ($_pdv->getMessage()->type == "C-Find-RQ") {
                         $find_rq_pdv = $_pdv;
                         break;
                     }
                 }
             }
             if (!$find_rq_pdv) {
                 return null;
             }
             $response = self::handleCDatas($find_rq_pdv, $last_pdv, $dicom_exchange);
         } else {
             // The PDV contain a header
             $msg = $last_pdv->getMessage();
             switch ($msg->getCommandField()->getValue()) {
                 case 0x30:
                     $response = self::handleCEchoRQ($last_pdv, $dicom_exchange);
                     break;
                 case 0x8030:
                     $response = self::handleCEchoRSP($last_pdv, $dicom_exchange);
                     break;
                 case 0x20:
                     $response = self::handleCFindRQ($last_pdv, $dicom_exchange);
                     break;
                 case 0x8020:
                     $response = self::handleCFindRSP();
                     break;
                 case 0xfff:
                     $response = self::handleCCancelFindRQ();
                     break;
                 default:
             }
         }
     }
     $time_aft_pdv = microtime(true);
     $dicom_exchange->store();
     $response["exchange_id"] = $dicom_exchange->_id;
     return $response;
 }