Merge branch '2013.10' into 2014.11
[tine20] / tine20 / ActiveSync / Controller.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     ActiveSync
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @author      Lars Kneschke <l.kneschke@metaways.de>
8  * @copyright   Copyright (c) 2008-2012 Metaways Infosystems GmbH (http://www.metaways.de)
9  * 
10  */
11
12 /**
13  * controller for ActiveSync
14  *
15  * @package     ActiveSync
16  */
17 class ActiveSync_Controller extends Tinebase_Controller_Abstract
18 {
19     /**
20      * holds the instance of the singleton
21      *
22      * @var ActiveSync_Controller
23      */
24     private static $_instance = NULL;
25     
26     /**
27      * constructor
28      */
29     private function __construct() 
30     {
31     }
32     
33     /**
34      * don't clone. Use the singleton.
35      *
36      */
37     private function __clone() 
38     {
39     }
40     
41     /**
42      * the singleton pattern
43      *
44      * @return ActiveSync_Controller
45      */
46     public static function getInstance() 
47     {
48         if (self::$_instance === NULL) {
49             self::$_instance = new ActiveSync_Controller;
50         }
51         
52         return self::$_instance;
53     }
54
55     /**
56      * reset sync for user
57      *
58      * @param mixed $user
59      * @param array $classesToReset
60      * @return boolean
61      */
62     public function resetSyncForUser($user, $classesToReset)
63     {
64
65         if (! $user instanceof Tinebase_Model_User) {
66             try {
67                 $user = Tinebase_User::getInstance()->getFullUserById($user);
68             } catch (Tinebase_Exception_NotFound $tenf) {
69                 $user = Tinebase_User::getInstance()->getUserByPropertyFromSqlBackend('accountLoginName', $user);
70             }
71         }
72
73         if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
74             . ' Resetting sync for user ' . $user->accountDisplayName . ' collections: ' . print_r($classesToReset, true));
75
76         self::initSyncrotonRegistry();
77         
78         $devices = $this->_getDevicesForUser($user->getId());
79         
80         foreach ($devices as $device) {
81             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
82                     . ' Resetting device' . $device->friendlyname . ' / id: ' . $device->getId());
83             
84             foreach ($classesToReset as $class) {
85                 $folderToReset = $this->_getFoldersForDeviceAndClass($device, $class);
86                 
87                 if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
88                         . ' Resetting ' . count($folderToReset) . ' folder(s) for class ' . $class);
89                 
90                 foreach ($folderToReset as $folderState) {
91                     Syncroton_Registry::getSyncStateBackend()->resetState($device->getId(), $folderState->id);
92                 }
93             }
94         }
95         
96         return true;
97     }
98     
99     /**
100      * fetch devices for user
101      * 
102      * @param string $userId
103      */
104     protected function _getDevicesForUser($userId)
105     {
106         $deviceBackend = new ActiveSync_Backend_Device();
107         $deviceFilter = new ActiveSync_Model_DeviceFilter(array(
108             array('field' => 'owner_id', 'operator' => 'equals', 'value' => $userId)
109         ));
110         $devices = $deviceBackend->search($deviceFilter);
111         return $devices;
112     }
113     
114     protected function _getFoldersForDeviceAndClass($device, $class)
115     {
116         $folderState = Syncroton_Registry::getFolderBackend()->getFolderState($device->getId(), $class);
117         return $folderState;
118     }
119     
120     public static function initSyncrotonRegistry()
121     {
122         Syncroton_Registry::setDatabase(Tinebase_Core::getDb());
123         Syncroton_Registry::setTransactionManager(Tinebase_TransactionManager::getInstance());
124         
125         Syncroton_Registry::set(Syncroton_Registry::DEVICEBACKEND,       new Syncroton_Backend_Device(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
126         Syncroton_Registry::set(Syncroton_Registry::FOLDERBACKEND,       new Syncroton_Backend_Folder(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
127         Syncroton_Registry::set(Syncroton_Registry::SYNCSTATEBACKEND,    new Syncroton_Backend_SyncState(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
128         Syncroton_Registry::set(Syncroton_Registry::CONTENTSTATEBACKEND, new Syncroton_Backend_Content(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
129         Syncroton_Registry::set(Syncroton_Registry::POLICYBACKEND,       new Syncroton_Backend_Policy(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
130         Syncroton_Registry::set(Syncroton_Registry::LOGGERBACKEND,       Tinebase_Core::getLogger());
131         Syncroton_Registry::set(Syncroton_Registry::SESSION_VALIDATOR,   function() {
132             return ! Tinebase_Core::inMaintenanceMode();
133         });
134     }
135 }