source: branches/1.1dev/lib/MCVE.inc.php @ 117

Last change on this file since 117 was 117, checked in by scdev, 18 years ago
File size: 6.5 KB
Line 
1<?php
2/**
3 * The MCVE:: class provides functions for communicating with a MCVE server.
4 *
5 * @author  Quinn Comendant <quinn@strangecode.com>
6 * @version 1.0
7 */
8class MCVE {
9
10    var $username;
11    var $password;
12    var $host = 'localhost';
13    var $ip_port = 8333;
14    var $ssl_port = 8444;
15    var $connect_method = 'ip';
16    var $timeout = 10;
17    var $blocking = 1;
18    var $connected = false;
19    var $conn;
20   
21    function MCVE($username, $password)
22    {
23        // Ensure PHP was compiled with the MCVE functions.
24        if (!extension_loaded('mcve')) {
25            trigger_error('MCVE class instantiation failed: MCVE extension not available.', E_USER_WARNING);
26            die;
27        }
28        $this->username = $username;
29        $this->password = $password;
30    }
31
32    function _connect()
33    {
34        if ($this->connected) {
35            return true;
36        }
37       
38        // Initialize SSL structures and definitions.
39        MCVE_InitEngine(CODE_BASE . '/config/ca-bundle.crt');
40       
41        // Allocate Connection Structures
42        $this->conn = MCVE_InitConn();
43       
44        // Set Connection Method and Locations
45        switch ($this->connect_method) {
46        case 'ip' :
47            if (!MCVE_SetIP($this->conn, $this->host, $this->ip_port)) {
48                logMsg('Could not set method to IP.', LOG_ERR, __FILE__, __LINE__);
49                return false;
50            }
51            break;
52        case 'ssl' :
53            if (!MCVE_SetSSL($this->conn, $this->host, $this->ssl_port)) {
54                logMsg('Could not set method to IP.', LOG_ERR, __FILE__, __LINE__);
55                return false;
56            }
57            break;
58        case 'dropfile' :
59            if (!MCVE_SetDropFile($this->conn, '/var/mcve/trans')) {
60                logMsg('Could not set method to IP.', LOG_ERR, __FILE__, __LINE__);
61                return false;
62            }
63            break;
64        default :
65            logMsg('Connection method not defined.', LOG_ERR, __FILE__, __LINE__);
66            return false;
67        }
68       
69        // Put connection into non-blocking mode, meaning that the client must
70        // loop waiting for the transaction to complete. You should always specify
71        // this function with your blocking preference as the default is currently
72        // non-blocking, but future versions of php_mcve will default to blocking.
73        if (!MCVE_SetBlocking($this->conn, $this->blocking)) {
74            logMsg('Could not set blocking mode.', LOG_ERR, __FILE__, __LINE__);
75            return false;
76        }
77       
78        // Maximum of 30s per transaction allowed. Timeout occurs on server-end, not client-end
79        if (!MCVE_SetTimeout($this->conn, $this->timeout)) {
80            logMsg('Could not set timeout.', LOG_ERR, __FILE__, __LINE__);
81            return false;
82        }
83       
84        // Connect to MCVE, if there's an error, print the exact reason for connection failure
85        if (!MCVE_Connect($this->conn)) {
86            $error = MCVE_ConnectionError($this->conn);
87            logMsg("Connection failed: $error. Are you sure the MCVE engine is running?", LOG_ERR, __FILE__, __LINE__);
88            return false;
89        }
90       
91        $this->connected = true;
92        return true;
93    }
94   
95    function beginTrans()
96    {
97        $this->_connect();
98        $tid = MCVE_TransNew($this->conn); // Allocate memory for sending a transaction.
99        $this->transParam($tid, MC_USERNAME, $this->username);
100        $this->transParam($tid, MC_PASSWORD, $this->password);
101        return $tid;
102    }
103   
104    function transParam($tid, $key, $var1, $var2=null)
105    {
106        if (!isset($var2)) {
107            return MCVE_TransParam($this->conn, $tid, $key, $var1);
108        } else {
109            return MCVE_TransParam($this->conn, $tid, $key, $var1, $var2);
110        }
111       
112    }
113   
114    function sendTrans($tid, $type='', $hide_msg=false)
115    {
116        // Finalize structuring of  to MCVE and ready it to be sent
117        if (!MCVE_TransSend($this->conn, $tid)) {
118            logMsg('Transaction improperly structured, possibly not enough info.', LOG_ERR, __FILE__, __LINE__);
119            return false;
120        }
121       
122        // Perform actual communication with MCVE engine.
123        // If blocking method is used, loop until transaction is complete
124        if ($this->blocking != 1) {
125            while (MCVE_CheckStatus($this->conn, $tid) != MCVE_DONE) {
126                MCVE_Monitor($this->conn); // Perform communication on connection
127                MCVE_uwait(10000); // Microsecond thread-safe sleep timer. Better than usleep()
128            }
129        }
130       
131        $ret_status = MCVE_ReturnStatus($this->conn, $tid);
132        $ret_code = MCVE_ReturnCode($this->conn, $tid);
133        $ret_text = mcve_text_code($ret_code);
134        $verbiage = MCVE_TransactionText($this->conn, $tid);
135   
136        // Check to see if transaction was successful or not using a strict success/fail function
137        if ($ret_status == MCVE_FAIL) {
138            raiseMsg(sprintf('MCVE %s failure: %s %s', $type, $ret_text, ('' == $verbiage ? '' : '(' . trim($verbiage) . ')')), MSG_WARNING, __FILE__, __LINE__);
139            return false;
140        } else if ($ret_status == MCVE_SUCCESS) {
141            if (!$hide_msg) {
142                raiseMsg(sprintf(_("MCVE %s success: %s %s"), $type, $ret_text, ('' == $verbiage ? '' : '(' . trim($verbiage) . ')')), MSG_SUCCESS, __FILE__, __LINE__);
143            }
144            logMsg(sprintf(_("MCVE success details. Auth: %s; Batch: %s; Item: %s; TTID: %s; AVS: %s; CV: %s."), 
145                MCVE_TransactionAuth($this->conn, $tid),
146                MCVE_TransactionBatch($this->conn, $tid),
147                MCVE_TransactionItem($this->conn, $tid),
148                MCVE_TransactionID($this->conn, $tid),
149                mcve_text_avs(MCVE_TransactionAVS($this->conn, $tid)),
150                mcve_text_cv(MCVE_TransactionCV($this->conn, $tid))
151            ), LOG_DEBUG, __FILE__, __LINE__);
152            return true;
153        } else {
154            logMsg(sprintf('Transaction failed. Unknown return code: %s', $ret_status), LOG_ERR, __FILE__, __LINE__);
155            return false;
156        }
157    }
158   
159    function disconnect($tid)
160    {
161        if ($this->connected) {
162            // Optional, clean up memory by transaction ... This is done automatically by
163            // MCVE_DestroyConn though
164            MCVE_DeleteTrans($this->conn, $tid);
165           
166            // Clean up and close MCVE.
167            MCVE_DestroyConn($this->conn);
168            MCVE_DestroyEngine();
169           
170            $this->connected = false;
171        }
172    }
173}
174// End of class.
175
176?>
Note: See TracBrowser for help on using the repository browser.