bbdd6d021863f3262cbfd75ef1bb883015c95bc2
[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 string $username
59      * @param array $classesToReset
60      * @return boolean
61      */
62     public function resetSyncForUser($username, $classesToReset)
63     {
64         if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
65                 . ' Resetting sync for user ' . $username . ' collections: ' . print_r($classesToReset, true));
66         
67         $user = Tinebase_User::getInstance()->getUserByPropertyFromSqlBackend('accountLoginName', $username);
68         
69         self::initSyncrotonRegistry();
70         
71         $devices = $this->_getDevicesForUser($user);
72         
73         foreach ($devices as $device) {
74             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
75                     . ' Resetting device' . $device->friendlyname . ' / id: ' . $device->getId());
76             
77             foreach ($classesToReset as $class) {
78                 $folderToReset = $this->_getFoldersForDeviceAndClass($device, $class);
79                 
80                 if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
81                         . ' Resetting ' . count($folderToReset) . ' folder(s) for class ' . $class);
82                 
83                 foreach ($folderToReset as $folderState) {
84                     Syncroton_Registry::getSyncStateBackend()->resetState($device->getId(), $folderState->id);
85                 }
86             }
87         }
88         
89         return true;
90     }
91     
92     /**
93      * fetch devices for user
94      * 
95      * @param Tinebase_Model_FullUser $user
96      */
97     protected function _getDevicesForUser($user)
98     {
99         $deviceBackend = new ActiveSync_Backend_Device();
100         $deviceFilter = new ActiveSync_Model_DeviceFilter(array(
101             array('field' => 'owner_id', 'operator' => 'equals', 'value' => $user->getId())
102         ));
103         $devices = $deviceBackend->search($deviceFilter);
104         return $devices;
105     }
106     
107     protected function _getFoldersForDeviceAndClass($device, $class)
108     {
109         $folderState = Syncroton_Registry::getFolderBackend()->getFolderState($device->getId(), $class);
110         return $folderState;
111     }
112     
113     public static function initSyncrotonRegistry()
114     {
115         Syncroton_Registry::setDatabase(Tinebase_Core::getDb());
116         Syncroton_Registry::setTransactionManager(Tinebase_TransactionManager::getInstance());
117         
118         Syncroton_Registry::set(Syncroton_Registry::DEVICEBACKEND,       new Syncroton_Backend_Device(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
119         Syncroton_Registry::set(Syncroton_Registry::FOLDERBACKEND,       new Syncroton_Backend_Folder(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
120         Syncroton_Registry::set(Syncroton_Registry::SYNCSTATEBACKEND,    new Syncroton_Backend_SyncState(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
121         Syncroton_Registry::set(Syncroton_Registry::CONTENTSTATEBACKEND, new Syncroton_Backend_Content(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
122         Syncroton_Registry::set(Syncroton_Registry::POLICYBACKEND,       new Syncroton_Backend_Policy(Tinebase_Core::getDb(), SQL_TABLE_PREFIX . 'acsync_'));
123         Syncroton_Registry::set('loggerBackend',       Tinebase_Core::getLogger());
124     }
125 }