Have SyncML use Horde_Session
authorMichael M Slusarz <slusarz@curecanti.org>
Wed, 17 Nov 2010 21:53:11 +0000 (14:53 -0700)
committerMichael M Slusarz <slusarz@curecanti.org>
Thu, 18 Nov 2010 16:39:16 +0000 (09:39 -0700)
19 files changed:
framework/SyncML/SyncML.php
framework/SyncML/SyncML/Backend.php
framework/SyncML/SyncML/Backend/Horde.php
framework/SyncML/SyncML/Command/Alert.php
framework/SyncML/SyncML/Command/Final.php
framework/SyncML/SyncML/Command/Get.php
framework/SyncML/SyncML/Command/Map.php
framework/SyncML/SyncML/Command/Put.php
framework/SyncML/SyncML/Command/Status.php
framework/SyncML/SyncML/Command/Sync.php
framework/SyncML/SyncML/Command/SyncHdr.php
framework/SyncML/SyncML/Device.php
framework/SyncML/SyncML/Device/Nokia.php
framework/SyncML/SyncML/Device/P800.php
framework/SyncML/SyncML/Device/Sync4j.php
framework/SyncML/SyncML/Device/Synthesis.php
framework/SyncML/SyncML/Sync.php
framework/SyncML/SyncML/XMLOutput.php
framework/SyncML/tests/testpacket.php

index af148e0..bcbe842 100644 (file)
@@ -1,11 +1,7 @@
 <?php
 /**
- * There are two global objects that are used by SyncML:
- * 1) $_SESSION['SyncML.state']:
- *    session object used to maintain the state between the individual
- *    SyncML messages.
- *
- * 2) $GLOBALS['backend']
+ * There is one global object used by SyncML:
+ * 1) $GLOBALS['backend']
  *    Backend to handle the communication with the datastore.
  *
  * @todo: Main Todos:
@@ -378,7 +374,7 @@ class SyncML_ContentHandler {
 
         /* Start the session. */
         $hdr->setupState();
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
         $state->wbxml = $this->_xmlWriter->isWBXML();
 
         /* Check auth. */
@@ -459,7 +455,7 @@ class SyncML_ContentHandler {
     {
         global $messageFull;
 
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
 
         /* If there's pending sync data and space left in the message, send
          * data now. */
index f98de3d..9db4999 100644 (file)
@@ -188,6 +188,13 @@ define ('SYNCML_BACKENDMODE_TEST',   3);
 class SyncML_Backend {
 
     /**
+     * The State object.
+     *
+     * @var SyncML_State
+     */
+    var $state;
+
+    /**
      * The concatenated log messages.
      *
      * @var string
@@ -387,10 +394,8 @@ class SyncML_Backend {
     /**
      * Is called after the SyncML_State object has been set up, either
      * restored from the session, or freshly created.
-     *
-     * @param SyncML_State  The current state object.
      */
-    function setupState(&$state)
+    function setupState()
     {
     }
 
index 9726acc..0aa22d4 100644 (file)
@@ -61,15 +61,22 @@ class SyncML_Backend_Horde extends SyncML_Backend {
                           $backendMode = SYNCML_BACKENDMODE_SERVER)
     {
         $this->_backendMode = $backendMode;
+        $this->_syncDeviceID = $syncDeviceID;
 
         /* Only the server needs to start a session. */
         if ($this->_backendMode == SYNCML_BACKENDMODE_SERVER) {
             /* Reload the Horde SessionHandler if necessary. */
-            $GLOBALS['session'] = new Horde_Session();
             $GLOBALS['session']->setup(false);
+            $this->state = $GLOBALS['session']->get('horde', 'syncml');
+            register_shutdown_function(array($this, 'sessionShutdown'));
         }
+    }
 
-        parent::sessionStart($syncDeviceID, $sessionId, $backendMode);
+    function sessionShutdown()
+    {
+        if ($this->state) {
+            $GLOBALS['session']->set('horde', 'syncml', $this->state);
+        }
     }
 
     /**
index 6e1a26a..ea945b6 100644 (file)
@@ -117,7 +117,8 @@ class SyncML_Command_Alert extends SyncML_Command {
      */
     function handleCommand($debug = false)
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
+
         // Handle unauthenticated first.
         if (!$state->authenticated) {
             $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName,
index 8be2be9..939fe40 100644 (file)
@@ -33,7 +33,7 @@ class SyncML_Command_Final extends SyncML_Command {
      */
     function handleCommand($debug = false)
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
 
         // If the client hasn't sent us device info, request it now.
         // @todo: only do this once, not in every msg if the client does not
index 6f72fdf..8c20dd0 100644 (file)
@@ -34,7 +34,7 @@ class SyncML_Command_Get extends SyncML_Command {
      */
     function handleCommand($debug = false)
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
 
         // Create status response.
         $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName,
index bfe16bc..914f2ba 100644 (file)
@@ -97,7 +97,7 @@ class SyncML_Command_Map extends SyncML_Command {
     function handleCommand($debug = false)
     {
         if (!$debug && $this->_mapSources) {
-            $state = &$_SESSION['SyncML.state'];
+            $state = $GLOBALS['backend']->state;
             $sync = &$state->getSync($this->_targetLocURI);
             if (!$state->authenticated) {
                 $GLOBALS['backend']->logMessage(
index 738368d..6551e62 100644 (file)
@@ -247,7 +247,7 @@ class SyncML_Command_Put extends SyncML_Command {
      */
     function handleCommand($debug = false)
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
 
         // Store received data.
         $state->deviceInfo = $this->_devinf;
index be8a52a..0757a1e 100644 (file)
@@ -108,7 +108,7 @@ class SyncML_Command_Status extends SyncML_Command {
             break;
 
         case 1:
-            $state = &$_SESSION['SyncML.state'];
+            $state = $GLOBALS['backend']->state;
             switch ($this->_Cmd) {
             case 'Replace':
             case 'Add':
index dd7c1f3..e1bf14d 100644 (file)
@@ -124,7 +124,7 @@ class SyncML_Command_Sync extends SyncML_Command {
     function startElement($uri, $element, $attrs)
     {
         parent::startElement($uri, $element, $attrs);
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
 
         switch (count($this->_stack)) {
         case 2:
@@ -183,7 +183,7 @@ class SyncML_Command_Sync extends SyncML_Command {
             case 'Item':
                 if ($this->_itemMoreData) {
                     // Store to continue in next session.
-                    $_SESSION['SyncML.state']->curSyncItem = $this->_curItem;
+                    $GLOBALS['backend']->state->curSyncItem = $this->_curItem;
                 } else {
                     // Finished. Store to syncElements[].
                     if (empty($this->_curItem->contentType)) {
@@ -268,7 +268,7 @@ class SyncML_Command_Sync extends SyncML_Command {
      */
     function handleCommand($debug = false)
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
 
         // Handle unauthenticated first.
         if (!$state->authenticated) {
index 6918412..2db6a1a 100644 (file)
@@ -185,31 +185,30 @@ class SyncML_Command_SyncHdr extends SyncML_Command {
      */
     function setupState()
     {
-        $GLOBALS['backend']->sessionStart($this->_sourceURI,
-                                          $this->_sessionID);
+        global $backend;
 
-        if (!isset($_SESSION['SyncML.state'])) {
-            $GLOBALS['backend']->logMessage(
+        $backend->sessionStart($this->_sourceURI, $this->_sessionID);
+
+        if (!$backend->state) {
+            $backend->logMessage(
                 'New session created: ' . session_id(), 'DEBUG');
-            $_SESSION['SyncML.state'] = new SyncML_State($this->_sourceURI,
-                                                         $this->user,
-                                                         $this->_sessionID);
+            $backend->state = new SyncML_State($this->_sourceURI,
+                                               $this->user,
+                                               $this->_sessionID);
         } else {
-            $GLOBALS['backend']->logMessage(
-                'Existing session continued: ' . session_id(), 'DEBUG');
+            $backend->logMessage('Existing session continued: ' . session_id(), 'DEBUG');
         }
 
-        $state = &$_SESSION['SyncML.state'];
-        $state->setVersion($this->_version);
-        $state->messageID = $this->_message;
-        $state->targetURI = $this->_targetURI;
-        $state->sourceURI = $this->_sourceURI;
-        $state->sessionID = $this->_sessionID;
+        $backend->state->setVersion($this->_version);
+        $backend->state->messageID = $this->_message;
+        $backend->state->targetURI = $this->_targetURI;
+        $backend->state->sourceURI = $this->_sourceURI;
+        $backend->state->sessionID = $this->_sessionID;
         if (!empty($this->_maxMsgSize)) {
-            $state->maxMsgSize = $this->_maxMsgSize;
+            $backend->state->maxMsgSize = $this->_maxMsgSize;
         }
 
-        $GLOBALS['backend']->setupState($state);
+        $backend->setupState();
     }
 
 }
index 1e75021..c108037 100644 (file)
@@ -115,7 +115,7 @@ class SyncML_Device {
      */
     function getPreferredContentTypeClient($serverSyncURI, $sourceSyncURI)
     {
-        $di = $_SESSION['SyncML.state']->deviceInfo;
+        $di = $GLOBALS['backend']->state->deviceInfo;
         $ds = $di->getDataStore($sourceSyncURI);
         if (!empty($ds)) {
             $r = $ds->getPreferredRXContentType();
index b4cfa01..aabb7c0 100644 (file)
@@ -29,7 +29,7 @@ class SyncML_Device_Nokia extends SyncML_Device {
 
         /* At least the Nokia E series seems to prefix category values with
          * X-, see bugs #6849 and #7824. */
-        $di = $_SESSION['SyncML.state']->deviceInfo;
+        $di = $GLOBALS['backend']->state->deviceInfo;
         if ($di->Mod[0] == 'E') {
             $content = preg_replace('/(\r\n|\r|\n)CATEGORIES:X-/',
                                     '\1CATEGORIES:', $content, 1);
index 84e1f51..1c22ef4 100644 (file)
@@ -128,7 +128,7 @@ class SyncML_Device_P800 extends SyncML_Device {
      */
     function handleTasksInCalendar()
     {
-        $di = $_SESSION['SyncML.state']->deviceInfo;
+        $di = $GLOBALS['backend']->state->deviceInfo;
 
         if (isset($di->CTCaps['text/x-vcalendar']) &&
             !empty($di->CTCaps['text/x-vcalendar']['BEGIN']->ValEnum['VEVENT']) &&
index 0fe47ce..5bd6d0e 100644 (file)
@@ -63,7 +63,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
 
         case 'text/calendar':
         case 'text/x-vcalendar':
-            $si = $_SESSION['SyncML.state']->sourceURI;
+            $si = $GLOBALS['backend']->state->sourceURI;
             if (stristr($si, 'fol-') !== false) {
                 // The Funambol Outlook connector uses invalid STATUS
                 // values. Actually it maps MeetingStatus values of the
@@ -107,7 +107,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
         if ($this->requestedContentType == $contentType) {
             if ($contentType == 'text/calendar' ||
                 $contentType == 'text/x-vcalendar') {
-                $si = $_SESSION['SyncML.state']->sourceURI;
+                $si = $GLOBALS['backend']->state->sourceURI;
                 if (stristr($si, 'fol-') !== false) {
                     // The Funambol Outlook connector uses invalid STATUS
                     // values. Actually it maps MeetingStatus values of the
index da1ab88..8cce68e 100644 (file)
@@ -34,7 +34,7 @@ class SyncML_Device_Synthesis extends SyncML_Device {
         list($content, $contentType, $encodingType) =
             parent::convertServer2Client($content, $contentType, $database);
 
-        $di = $_SESSION['SyncML.state']->deviceInfo;
+        $di = $GLOBALS['backend']->state->deviceInfo;
         if (stristr($di->Mod,'palm') === false) {
             // Some special priority handling is required. Synthesis uses
             // 1 (high), 2 (medium), 3(low), at least for my windows mobile device.
@@ -71,7 +71,7 @@ class SyncML_Device_Synthesis extends SyncML_Device {
         list($content, $contentType) =
             parent::convertClient2Server($content, $contentType);
 
-        $di = $_SESSION['SyncML.state']->deviceInfo;
+        $di = $GLOBALS['backend']->state->deviceInfo;
         if (stristr($di->Mod, 'palm') === false) {
             // Some special priority handling is required. Synthesis uses 1
             // (high), 2 (medium), 3(low), at least for my windows mobile
index 7efb672..7e13617 100644 (file)
@@ -232,7 +232,7 @@ class SyncML_Sync {
             }
         }
 
-        $device = $_SESSION['SyncML.state']->getDevice();
+        $device = $GLOBALS['backend']->state->getDevice();
         $hordedatabase = $database = $this->_targetLocURI;
         $content = $item->content;
         if ($item->contentFormat == 'b64') {
@@ -241,7 +241,7 @@ class SyncML_Sync {
 
         if (($item->contentType == 'text/calendar' ||
              $item->contentType == 'text/x-vcalendar') &&
-            $backend->_normalize($database) == 'calendar' && 
+            $backend->_normalize($database) == 'calendar' &&
             $device->handleTasksInCalendar()) {
             $tasksincalendar = true;
             /* Check if the client sends us a vtodo in a calendar sync. */
@@ -369,7 +369,7 @@ class SyncML_Sync {
          * pending Sync data, the final command will sent the pending data. */
         $messageFull = false;
 
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
         $device = $state->getDevice();
         $contentType = $device->getPreferredContentTypeClient(
             $this->_targetLocURI, $this->_sourceLocURI);
@@ -741,7 +741,7 @@ class SyncML_Sync {
 
     function createUidMap($databaseURI, $cuid, $suid)
     {
-        $device = $_SESSION['SyncML.state']->getDevice();
+        $device = $GLOBALS['backend']->state->getDevice();
 
         if ($GLOBALS['backend']->_normalize($databaseURI) == 'calendar' &&
             $device->handleTasksInCalendar() &&
@@ -755,7 +755,6 @@ class SyncML_Sync {
         $GLOBALS['backend']->logMessage(
             'Created map for client id ' . $cuid . ' and server id ' . $suid
             . ' in database ' . $db, 'DEBUG');
-
     }
 
     /**
index abf5920..2f9ea54 100644 (file)
@@ -85,7 +85,8 @@ class SyncML_XMLOutput {
      */
     function outputHeader($respURI)
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
+
         $this->_uriMeta = $state->uriMeta;
 
         $this->_output->startElement($this->_uri, 'SyncHdr');
@@ -157,7 +158,7 @@ class SyncML_XMLOutput {
 
     function outputInit()
     {
-        $this->_uri = $_SESSION['SyncML.state']->getURI();
+        $this->_uri = $GLOBALS['backend']->state->getURI();
 
         $this->_output->startElement($this->_uri, 'SyncML', array());
     }
@@ -185,7 +186,7 @@ class SyncML_XMLOutput {
                          $syncAnchorNext = '',
                          $syncAnchorLast = '')
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
         $uriMeta = $state->uriMeta;
 
         $this->_output->startElement($this->_uri, 'Status');
@@ -277,7 +278,7 @@ class SyncML_XMLOutput {
 
     function outputDevInf($cmdRef)
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
         $uriMeta = $state->uriMeta;
         $uriDevInf = $state->uriDevInf;
 
@@ -373,7 +374,7 @@ class SyncML_XMLOutput {
     function _writeDataStore($sourceref, $mimetype, $version, &$output,
                              $additionaltypes = array())
     {
-        $uriDevInf = $_SESSION['SyncML.state']->uriDevInf;
+        $uriDevInf = $GLOBALS['backend']->state->uriDevInf;
 
         $output->startElement($uriDevInf , 'DataStore');
         $output->startElement($uriDevInf , 'SourceRef');
@@ -434,7 +435,7 @@ class SyncML_XMLOutput {
 
     function outputAlert($alertCode, $clientDB = '', $serverDB = '', $lastAnchor = '', $nextAnchor = '')
     {
-        $uriMeta = $_SESSION['SyncML.state']->uriMeta;
+        $uriMeta = $GLOBALS['backend']->state->uriMeta;
 
         $this->_output->startElement($this->_uri, 'Alert');
         $this->_outputCmdID();
@@ -478,7 +479,7 @@ class SyncML_XMLOutput {
 
 
         // MaxObjSize, required by protocol for SyncML1.1 and higher.
-        if ($_SESSION['SyncML.state']->version > 0) {
+        if ($GLOBALS['backend']->state->version > 0) {
             $this->_output->startElement($uriMeta, 'MaxObjSize');
             $this->_output->characters(SERVER_MAXOBJSIZE);
             $this->_output->endElement($uriMeta, 'MaxObjSize');
@@ -493,7 +494,7 @@ class SyncML_XMLOutput {
 
     function outputGetDevInf()
     {
-        $state = &$_SESSION['SyncML.state'];
+        $state = $GLOBALS['backend']->state;
         $uriMeta = $state->uriMeta;
 
         $this->_output->startElement($this->_uri, 'Get');
@@ -536,7 +537,7 @@ class SyncML_XMLOutput {
     function outputSyncCommand($command, $content = null, $contentType = null,
                                $encodingType = null, $cuid = null, $suid = null)
     {
-        $uriMeta = $_SESSION['SyncML.state']->uriMeta;
+        $uriMeta = $GLOBALS['backend']->state->uriMeta;
 
         $this->_output->startElement($this->_uri, $command);
         $this->_outputCmdID();
@@ -579,7 +580,7 @@ class SyncML_XMLOutput {
                 if($this->isWBXML()) {
                     $this->_output->characters($content);
                 } else {
-                    $device = $_SESSION['SyncML.state']->getDevice();
+                    $device = $GLOBALS['backend']->state->getDevice();
                     if ($device->useCdataTag()) {
                         /* Enclose data in CDATA if possible to avoid */
                         /* problems with &,< and >. */
index ca73439..eeaa50c 100755 (executable)
@@ -40,10 +40,10 @@ class Backend extends SyncML_Backend {
         return strlen($username) ? $username : true;
     }
 
-    function setupState(&$state)
+    function setupState()
     {
-        $state->user = 'dummyUser';
-        $state->authenticated = true;
+        $this->state->user = 'dummyUser';
+        $this->state->authenticated = true;
     }
 
     function addEntry($databaseURI, $content, $contentType, $cuid)