/**
  * Run this state
  */
 public function run()
 {
     $this->configureAvailableTransitions();
     $this->stateMachine->setState($this);
     $this->process();
     $this->stateMachine->addStateToHistory($this);
     $this->doTransition();
 }
Example #2
0
function HandleFolderCreate($backend, $protocolversion)
{
    global $zpushdtd;
    global $input, $output;
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    $el = $decoder->getElement();
    if ($el[EN_TYPE] != EN_TYPE_STARTTAG) {
        return false;
    }
    $create = $update = $delete = false;
    if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERCREATE) {
        $create = true;
    } else {
        if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERUPDATE) {
            $update = true;
        } else {
            if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERDELETE) {
                $delete = true;
            }
        }
    }
    if (!$create && !$update && !$delete) {
        return false;
    }
    // SyncKey
    if (!$decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_SYNCKEY)) {
        return false;
    }
    $synckey = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // ServerID
    $serverid = false;
    if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_SERVERENTRYID)) {
        $serverid = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    // when creating or updating more information is necessary
    if (!$delete) {
        // Parent
        $parentid = false;
        if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_PARENTID)) {
            $parentid = $decoder->getElementContent();
            if (!$decoder->getElementEndTag()) {
                return false;
            }
        }
        // Displayname
        if (!$decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_DISPLAYNAME)) {
            return false;
        }
        $displayname = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
        // Type
        $type = false;
        if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_TYPE)) {
            $type = $decoder->getElementContent();
            if (!$decoder->getElementEndTag()) {
                return false;
            }
        }
    }
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // Get state of hierarchy
    $statemachine = new StateMachine();
    $syncstate = $statemachine->getSyncState($synckey);
    $newsynckey = $statemachine->getNewSyncKey($synckey);
    // additional information about already seen folders
    $seenfolders = unserialize($statemachine->getSyncState("s" . $synckey));
    if (!$seenfolders) {
        $seenfolders = array();
    }
    // Configure importer with last state
    $importer = $backend->GetHierarchyImporter();
    $importer->Config($syncstate);
    if (!$delete) {
        // Send change
        $serverid = $importer->ImportFolderChange($serverid, $parentid, $displayname, $type);
    } else {
        // delete folder
        $deletedstat = $importer->ImportFolderDeletion($serverid, 0);
    }
    $encoder->startWBXML();
    if ($create) {
        // add folder id to the seen folders
        $seenfolders[] = $serverid;
        $encoder->startTag(SYNC_FOLDERHIERARCHY_FOLDERCREATE);
        $encoder->startTag(SYNC_FOLDERHIERARCHY_STATUS);
        $encoder->content(1);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SYNCKEY);
        $encoder->content($newsynckey);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SERVERENTRYID);
        $encoder->content($serverid);
        $encoder->endTag();
        $encoder->endTag();
        $encoder->endTag();
    } elseif ($update) {
        $encoder->startTag(SYNC_FOLDERHIERARCHY_FOLDERUPDATE);
        $encoder->startTag(SYNC_FOLDERHIERARCHY_STATUS);
        $encoder->content(1);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SYNCKEY);
        $encoder->content($newsynckey);
        $encoder->endTag();
        $encoder->endTag();
    } elseif ($delete) {
        $encoder->startTag(SYNC_FOLDERHIERARCHY_FOLDERDELETE);
        $encoder->startTag(SYNC_FOLDERHIERARCHY_STATUS);
        $encoder->content($deletedstat);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SYNCKEY);
        $encoder->content($newsynckey);
        $encoder->endTag();
        $encoder->endTag();
        // remove folder from the folderflags array
        if (($sid = array_search($serverid, $seenfolders)) !== false) {
            unset($seenfolders[$sid]);
            $seenfolders = array_values($seenfolders);
            debugLog("deleted from seenfolders: " . $serverid);
        }
    }
    $encoder->endTag();
    // Save the sync state for the next time
    $statemachine->setSyncState($newsynckey, $importer->GetState());
    $statemachine->setSyncState("s" . $newsynckey, serialize($seenfolders));
    return true;
}
Example #3
0
File: Mapper.php Project: arhe/pwak
 /**
  * Construit la requête SELECT complète. Cette méthode est utilisé par
  * Mapper::load et Mapper::loadCollection
  *
  * @access private
  * @param  mixed $attributeFilters un tableau ou un objet filtre
  * @param  array $sortOrder un tableau pour les tris
  * @return string la requête SELECT
  */
 private function _getSQLRequest($attributeFilters = array(), $sortOrder = array(), $fields = array())
 {
     $filteraddon = $params = array();
     if (false != call_user_func(array($this->_cls, 'getParentClassName'))) {
         $filteraddon['ClassName'] = $this->_cls;
         $params[] = 'ClassName';
     }
     if ($attributeFilters instanceof FilterComponent) {
         $filter = SearchTools::buildFilterFromArray($filteraddon, $attributeFilters);
         $filterMacros = $attributeFilters->CollectMacros();
     } else {
         if (is_array($attributeFilters)) {
             $filter = SearchTools::buildFilterFromArray(array_merge($filteraddon, $attributeFilters), false, $this->_cls);
             $filterMacros = $filter->CollectMacros();
         }
     }
     // si fields est un tableau
     if (empty($fields)) {
         $params = array('*');
     } else {
         if (!in_array('Id', $fields)) {
             $params[] = 'Id';
         }
         if (defined('DATABASE_ID') && !in_array('DBId', $fields)) {
             $params[] = 'DBId';
         }
         if (property_exists($this->_cls, 'lastModified')) {
             $params[] = 'LastModified';
         }
         $params = array_merge($params, $fields);
     }
     // on appelle le state machine pour construire la requête
     $stateMachine = new StateMachine($this->_cls, $params, $filterMacros, $sortOrder);
     return $stateMachine->toSQL($filter);
 }
Example #4
0
         $protstate->setProtocolState("2.0,2.1,2.5,12.0,12.1,14.0,14.1");
     }
     unset($protstate);
     // END ADDED dw2412
     // START CHANGED dw2412 Settings and ItemOperations Command Support
     header("MS-ASProtocolCommands: Sync,SendMail,SmartForward,SmartReply,GetAttachment,GetHierarchy,CreateCollection,DeleteCollection,MoveCollection,FolderSync,FolderCreate,FolderDelete,FolderUpdate,MoveItems,GetItemEstimate,MeetingResponse,ResolveRecipients,ValidateCert,Provision,Settings,Search,Ping,ItemOperations");
     debugLog("Options request");
     break;
 case 'POST':
     // dw2412 changed to support AS14 Protocol
     //		header("MS-Server-ActiveSync: 14.0");
     header("MS-Server-ActiveSync: 14.1");
     debugLog("POST cmd: {$cmd}");
     // Update X-MS-RP In case version changed
     include_once 'statemachine.php';
     $protstate = new StateMachine($devid, $user);
     $protsupp = $protstate->getProtocolState();
     if ($protsupp !== false && $protsupp != "2.0,2.1,2.5,12.0,12.1,14.0,14.1") {
         header("X-MS-RP: 2.0,2.1,2.5,12.0,12.1,14.0,14.1");
         debugLog("Sending X-MS-RP to update Protocol Version on Device");
         $protstate->setProtocolState("2.0,2.1,2.5,12.0,12.1,14.0,14.1");
     }
     unset($protstate);
     // Do the actual request
     if (!HandleRequest($backend, $cmd, $devid, $protocolversion, $multipart)) {
         // Request failed. Try to output some kind of error information. We can only do this if
         // output had not started yet. If it has started already, we can't show the user the error, and
         // the device will give its own (useless) error message.
         if (!headers_sent()) {
             header("Content-type: text/html");
             print "<BODY>\n";
Example #5
0
function HandleFolderCreate($backend, $protocolversion)
{
    global $zpushdtd;
    global $input, $output;
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    $el = $decoder->getElement();
    if ($el[EN_TYPE] != EN_TYPE_STARTTAG) {
        return false;
    }
    $create = $update = $delete = false;
    if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERCREATE) {
        $create = true;
    } else {
        if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERUPDATE) {
            $update = true;
        } else {
            if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERDELETE) {
                $delete = true;
            }
        }
    }
    if (!$create && !$update && !$delete) {
        return false;
    }
    // SyncKey
    if (!$decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_SYNCKEY)) {
        return false;
    }
    $synckey = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // ServerID
    $serverid = false;
    if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_SERVERENTRYID)) {
        $serverid = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    // Parent
    $parentid = false;
    if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_PARENTID)) {
        $parentid = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    // Displayname
    if (!$decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_DISPLAYNAME)) {
        return false;
    }
    $displayname = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // Type
    $type = false;
    if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_TYPE)) {
        $type = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // Get state of hierarchy
    $statemachine = new StateMachine();
    $syncstate = $statemachine->getSyncState($synckey);
    $newsynckey = $statemachine->getNewSyncKey($synckey);
    // Configure importer with last state
    $importer = $backend->GetHierarchyImporter();
    $importer->Config($syncstate);
    // Send change
    $serverid = $importer->ImportFolderChange($serverid, $parentid, $displayname, $type);
    $encoder->startWBXML();
    $encoder->startTag(SYNC_FOLDERHIERARCHY_FOLDERCREATE);
    $encoder->startTag(SYNC_FOLDERHIERARCHY_ERROR);
    $encoder->content(1);
    $encoder->endTag();
    $encoder->startTag(SYNC_FOLDERHIERARCHY_SYNCKEY);
    $encoder->content($newsynckey);
    $encoder->endTag();
    $encoder->startTag(SYNC_FOLDERHIERARCHY_SERVERENTRYID);
    $encoder->content($serverid);
    $encoder->endTag();
    $encoder->endTag();
    $encoder->endTag();
    // Save the sync state for the next time
    $statemachine->setSyncState($newsynckey, $importer->GetState());
    return true;
}
<?php

require_once "StateMachine.class.php";
echo "StateMachine\n\n";
/*  Set up:  */
$state = new StateMachine();
$state->addState("idle")->addState("symbol")->addState("variable")->addState("doublequoted")->addState("singlequoted")->addState("escaped")->addEvent("idle", "dollarsign", "variable")->addEvent("idle", "doublequote", "doublequoted")->addEvent("idle", "singlequote", "singlequoted")->addEvent("idle", "alpha", "symbol")->addEvent("idle", "nonalpha", "symbol")->addEvent("symbol", "alpha", "symbol")->addEventAny("symbol", "idle")->addEvent("variable", "alpha", "variable")->addEventAny("variable")->addEvent("doublequoted", "escape", "escaped")->addEvent("doublequoted", "dollarsign", "variable")->addEvent("doublequoted", "doublequote", "idle")->addEvent("singlequoted", "singlequote", "idle")->addEvent("singlequoted", "singlequote", "idle")->addEventAny("escaped")->start("idle");
/*  Example: */
$parse_this = "This text has some \"DOBLE QUOTED PARTS WITH \$vars AND \\e\\s\\capes ON IT\", along with some 'single quoted text too with futile e\\s\\c\\a\\p\\e\\s'\"(because they don't work on single quotes)\" and some \$variable_names\n";
echo $parse_this;
$triggers = array("\\" => "escape", '"' => "doublequote", "'" => "singlequote", '$' => "dollarsign");
// first character intentionally left blank to add 1 to position count of the
// rest
$alpha = " abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789";
$stored = "";
for ($i = 0; $i < strlen($parse_this); $i++) {
    $char = $parse_this[$i];
    if (isset($triggers[$char])) {
        $state->trigger($triggers[$char]);
    } else {
        $state->trigger(strpos($alpha, $char) ? "alpha" : "nonalpha");
    }
    if (!$state->changed() || $state->previous() == "escaped") {
        $stored .= $char;
    } elseif ($state->state() == "escaped") {
    } else {
        switch ($state->previous()) {
            case "idle":
                $stored = "";
                break;
            case "symbol":
Example #7
0
function HandleFolderCreate($backend, $devid, $protocolversion)
{
    global $zpushdtd;
    global $input, $output;
    global $user;
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    $el = $decoder->getElement();
    if ($el[EN_TYPE] != EN_TYPE_STARTTAG) {
        return false;
    }
    $create = $update = $delete = false;
    if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERCREATE) {
        $create = true;
    } else {
        if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERUPDATE) {
            $update = true;
        } else {
            if ($el[EN_TAG] == SYNC_FOLDERHIERARCHY_FOLDERDELETE) {
                $delete = true;
            }
        }
    }
    if (!$create && !$update && !$delete) {
        return false;
    }
    // SyncKey
    if (!$decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_SYNCKEY)) {
        return false;
    }
    $synckey = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // ServerID
    $serverid = false;
    if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_SERVERENTRYID)) {
        $serverid = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    // when creating or updating more information is necessary
    if (!$delete) {
        // Parent
        $parentid = false;
        if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_PARENTID)) {
            $parentid = $decoder->getElementContent();
            if (!$decoder->getElementEndTag()) {
                return false;
            }
        }
        // Displayname
        if (!$decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_DISPLAYNAME)) {
            return false;
        }
        $displayname = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
        // Type
        $type = false;
        if ($decoder->getElementStartTag(SYNC_FOLDERHIERARCHY_TYPE)) {
            $type = $decoder->getElementContent();
            if (!$decoder->getElementEndTag()) {
                return false;
            }
        }
    }
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // Get state of hierarchy
    $statemachine = new StateMachine($devid, $user);
    $syncstate = $statemachine->getSyncState($synckey);
    if (is_numeric($syncstate) && $syncstate < 0 && strlen($syncstate) < 8) {
        debugLog("GetSyncState: Got an error in HandleGetFolderCreate - syncstate");
        $syncstate = false;
    }
    $newsynckey = $statemachine->getNewSyncKey($synckey);
    // additional information about already seen folders
    $seenfolders = $statemachine->getSyncState("s" . $synckey);
    if ($synckey != "0" && is_numeric($seenfolders) && $seenfolders < 0) {
        debugLog("GetSyncState: Got an error in HandleGetFolderCreate - seenfolders");
        $seenfolders = false;
    }
    $seenfolders = unserialize($seenfolders);
    if (!$seenfolders) {
        $seenfolders = array();
    }
    if ($synckey != "0") {
        $statemachine->cleanOldSyncState("s" . $synckey);
        $statemachine->cleanOldSyncState($synckey);
    }
    // get the foldercache from synccache
    $foldercache = unserialize($statemachine->getSyncCache());
    if (!$delete && !$create) {
        debugLog("Here1 folder create serverid: " . $serverid . " type: " . $type . " displayname: " . $displayname . " parentid: " . $parentid);
        if (!isset($serverid) || $serverid === false) {
            return false;
        }
        if ($type === false && isset($foldercache['folders'][$serverid]['type'])) {
            $type = $foldercache['folders'][$serverid]['type'];
        }
        if ($displayname === false && isset($foldercache['folders'][$serverid]['displayname'])) {
            $displayname = $foldercache['folders'][$serverid]['displayname'];
        }
        if ($parentid === false && isset($foldercache['folders'][$serverid]['parentid'])) {
            $parentid = $foldercache['folders'][$serverid]['parentid'];
        }
        if ($type === false || $displayname === false || $parentid === false) {
            return false;
        }
        debugLog("Here2 folder create serverid: " . $serverid . " type: " . $type . " displayname: " . $displayname . " parentid: " . $parentid);
    }
    // Configure importer with last state
    $importer = $backend->GetHierarchyImporter();
    $importer->Config($syncstate);
    if (!$delete) {
        // Send change
        $serverid = $importer->ImportFolderChange($serverid, $parentid, $displayname, $type);
        // add the folderinfo to synccache
        $statemachine->updateSyncCacheFolder($foldercache, $serverid, $parentid, $displayname, $type);
    } else {
        // delete folder
        $deletedstat = $importer->ImportFolderDeletion($serverid, 0);
        // remove the folder from synccache
        $statemachine->deleteSyncCacheFolder($foldercache, $serverid);
    }
    $encoder->startWBXML();
    if ($create) {
        // add folder id to the seen folders
        $seenfolders[] = $serverid;
        $encoder->startTag(SYNC_FOLDERHIERARCHY_FOLDERCREATE);
        $encoder->startTag(SYNC_FOLDERHIERARCHY_STATUS);
        $encoder->content(1);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SYNCKEY);
        $encoder->content($newsynckey);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SERVERENTRYID);
        $encoder->content($serverid);
        $encoder->endTag();
        $encoder->endTag();
        $encoder->endTag();
    } elseif ($update) {
        $encoder->startTag(SYNC_FOLDERHIERARCHY_FOLDERUPDATE);
        $encoder->startTag(SYNC_FOLDERHIERARCHY_STATUS);
        $encoder->content(1);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SYNCKEY);
        $encoder->content($newsynckey);
        $encoder->endTag();
        $encoder->endTag();
    } elseif ($delete) {
        $encoder->startTag(SYNC_FOLDERHIERARCHY_FOLDERDELETE);
        $encoder->startTag(SYNC_FOLDERHIERARCHY_STATUS);
        $encoder->content($deletedstat);
        $encoder->endTag();
        $encoder->startTag(SYNC_FOLDERHIERARCHY_SYNCKEY);
        $encoder->content($newsynckey);
        $encoder->endTag();
        $encoder->endTag();
        // remove folder from the folderflags array
        if (($sid = array_search($serverid, $seenfolders)) !== false) {
            unset($seenfolders[$sid]);
            $seenfolders = array_values($seenfolders);
            debugLog("deleted from seenfolders: " . $serverid);
        }
    }
    $encoder->endTag();
    // Save the sync state for the next time
    $statemachine->setSyncState($newsynckey, $importer->GetState());
    $statemachine->setSyncState("s" . $newsynckey, serialize($seenfolders));
    $statemachine->setSyncCache(serialize($foldercache), true);
    return true;
}
Example #8
0
 /**
  * New states are added to the end only
  *
  * @return void
  */
 public function testNewStatesAreAddedToTheEnd()
 {
     $stateMachine = new StateMachine();
     $stateMachine->addState("<?xml version=\"1.0\"?><listofitems><item id=\"1\" index=\"1\">First</item><item id=\"2\">Second</item></listofitems>");
     $stateMachine->addState("<?xml version=\"1.0\"?><listofitems><item id=\"2\">second</item><item id=\"3\">Third</item></listofitems>");
     $stateMachine->addState("<?xml version=\"1.0\"?><listofitems><item id=\"1\" index=\"1\">First</item><item id=\"2\">Second</item></listofitems>");
     $stateMachine->addState("<?xml version=\"1.0\"?><listofitems><item id=\"4\">Fourth</item></listofitems>");
     $this->assertEquals(true, $stateMachine->verifyIntegrity());
     $stateMachine->addState("<?xml version=\"1.0\"?><listofitems><item id=\"5\">fifth</item><item id=\"3\">Third</item></listofitems>");
     $this->assertXmlStringEqualsXmlString("<?xml version=\"1.0\"?><listofitems><item id=\"2\">second</item><item id=\"3\">Third</item></listofitems>", $stateMachine->getState(2));
     $this->assertEquals(true, $stateMachine->verifyIntegrity());
 }
Example #9
0
 public function testResolveTimeoutsWithPayloadInCorrectState()
 {
     $timeout = $this->getMockBuilder('\\StateMachine\\PayloadTimeout')->disableOriginalConstructor()->getMock();
     $timeout->expects($this->any())->method('getState')->willReturn('timeout');
     $this->timeoutHandler->expects($this->any())->method('getExpired')->willReturn([$timeout]);
     $this->payload->expects($this->any())->method('getState')->willReturn('timeout');
     $this->payloadHandler->expects($this->any())->method('restore')->willReturn($this->payload);
     $this->adapter->expects($this->any())->method('getProcess')->willReturn($this->process);
     $this->process->expects($this->once())->method('triggerEvent');
     $this->timeoutHandler->expects($this->once())->method('remove');
     $machine = new StateMachine($this->adapter, $this->payloadHandler, $this->timeoutHandler, $this->lockHandler);
     $machine->resolveTimeouts();
 }
 /**
  * Inject the <b>StateMachine</b> into the PureMVC apparatus.
  * 
  * Creates the <b>StateMachine</b> instance, registers all the states
  * and registers the <b>StateMachine</b> with the <b>IFacade</b>.
  * 
  * @return void
  */
 public function inject()
 {
     // Create the StateMachine
     $stateMachine = new StateMachine();
     // Register all the states with the StateMachine
     foreach ($this->getStates() as $state) {
         $stateMachine->registerState($state, $this->isInitial($state->name));
     }
     // Register the StateMachine with the facade
     $this->facade()->registerMediator($stateMachine);
 }