Merge branch 'master' of http://git.tine20.org/git/Syncope
[tine20] / tine20 / library / Syncope / lib / Syncope / Backend / Device.php
1 <?php
2
3 /**
4  * Syncope
5  *
6  * @package     Command
7  * @license     http://www.tine20.org/licenses/agpl-nonus.txt AGPL Version 1 (Non-US)
8  *              NOTE: According to sec. 8 of the AFFERO GENERAL PUBLIC LICENSE (AGPL), 
9  *              Version 1, the distribution of the Tine 2.0 Syncope module in or to the 
10  *              United States of America is excluded from the scope of this license.
11  * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
12  * @author      Lars Kneschke <l.kneschke@metaways.de>
13  */
14
15 /**
16  * class to handle ActiveSync Sync command
17  *
18  * @package     Backend
19  */
20  
21 class Syncope_Backend_Device implements Syncope_Backend_IDevice
22 {
23     /**
24      * the database adapter
25      * 
26      * @var Zend_Db_Adapter_Abstract
27      */
28     protected $_db;
29     
30     protected $_tablePrefix;
31     
32     public function __construct(Zend_Db_Adapter_Abstract $_db, $_tablePrefix = 'syncope_')
33     {
34         $this->_db          = $_db;
35         $this->_tablePrefix = $_tablePrefix;
36     }
37
38     /**
39      * create new device
40      * 
41      * @param Syncope_Model_IDevice $_device
42      * @return Syncope_Model_IDevice
43      */
44     public function create(Syncope_Model_IDevice $_device)
45     {
46         $id = sha1(mt_rand(). microtime());
47         
48         $this->_db->insert($this->_tablePrefix . 'device', array(
49                 'id'         => $id, 
50                 'deviceid'   => $_device->deviceid,
51                 'devicetype' => $_device->devicetype,
52                 'owner_id'   => $_device->owner_id,
53                 'policy_id'  => isset($_device->policy_id)  ? $_device->policy_id  : null,
54                 'policykey'  => isset($_device->policykey)  ? $_device->policykey  : null ,
55                 'useragent'  => isset($_device->useragent)  ? $_device->useragent  : null ,
56                 'acsversion' => isset($_device->acsversion) ? $_device->acsversion : null ,
57                 'remotewipe' => isset($_device->remotewipe) ? $_device->remotewipe : null 
58         ));
59         
60         return $this->get($id);
61     }
62     
63     /**
64      * @param string  $_id
65      * @throws Syncope_Exception_NotFound
66      * @return Syncope_Model_IDevice
67      */
68     public function get($_id)
69     {
70         $select = $this->_db->select()
71             ->from($this->_tablePrefix . 'device')
72             ->where('id = ?', $_id);
73             
74         $stmt = $this->_db->query($select);
75         $device = $stmt->fetchObject('Syncope_Model_Device');
76         
77         if (! $device instanceof Syncope_Model_IDevice) {
78             throw new Syncope_Exception_NotFound('id not found');
79         }
80         
81         return $device;
82     }
83     
84     /**
85      * return device for this user
86      * either we found an existing device or we create a new one
87      * 
88      * @param  string  $userId
89      * @param  string  $deviceId
90      * @param  string  $deviceType
91      * @return Syncope_Model_Device
92      */
93     public function getUserDevice($ownerId, $deviceId, $deviceType)
94     {
95         $select = $this->_db->select()
96             ->from($this->_tablePrefix . 'device')
97             ->where('owner_id = ?', $ownerId)
98             ->where('deviceid = ?', $deviceId)
99             ->where('devicetype = ?', $deviceType);
100         
101         $stmt = $this->_db->query($select);
102         $device = $stmt->fetchObject('Syncope_Model_Device');
103         
104         if ($device instanceof Syncope_Model_IDevice) {
105             return $device;
106         }
107         
108         // device not found
109         $newDevice = new Syncope_Model_Device(array(
110             'owner_id'   => $ownerId,
111             'deviceid'   => $deviceId,
112             'devicetype' => $deviceType
113         ));
114         
115         return $this->create($newDevice);
116     }
117     
118     public function delete($_id)
119     {
120         $id = $_id instanceof Syncope_Model_IDevice ? $_id->id : $id;
121         
122         $result = $this->_db->delete($this->_tablePrefix . 'device', array('id' => $id));
123         
124         return (bool) $result;
125     }
126     
127     public function update(Syncope_Model_IDevice $_device)
128     {
129         $this->_db->update($this->_tablePrefix . 'device', array(
130                 'acsversion'   => $_device->acsversion,
131                 'policykey'    => $_device->policykey,
132                 'pingfolder'   => $_device->pingfolder,
133                 'pinglifetime' => $_device->pinglifetime,
134                 'remotewipe'   => $_device->remotewipe
135         ), array(
136                 'id = ?' => $_device->id
137         ));
138         
139         return $this->get($_device->id);
140         
141     }
142 }