/** * Run this state */ public function run() { $this->configureAvailableTransitions(); $this->stateMachine->setState($this); $this->process(); $this->stateMachine->addStateToHistory($this); $this->doTransition(); }
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; }
/** * 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); }
$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";
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":
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; }
/** * 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()); }
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); }