patch_apply($dmp->patch_fromText($patchFromClient), $serverText); file_put_contents($serverTextFilename, $patchedServerText[0]); /* print_r('patched server text:'); */ /* print_r($patchedServerText); */ $patchedShadowText = $dmp->patch_apply($dmp->patch_fromText($patchFromClient), $shadowText); file_put_contents($shadowFilename, $patchedShadowText[0]); /* print_r('patched shadow text:'); */ /* print_r($patchedShadowText); */ /* Make a diff between server text and shadow to get the edits to send * back to the client. */ $patchFromServer = $dmp->patch_toText($dmp->patch_make($patchedShadowText[0], $patchedServerText[0])); /* print_r('patch from server:'); */ /* print_r($patchFromServer); */ file_put_contents($serverTextFilename, $patchedServerText); file_put_contents($shadowFilename, $patchedShadowText); /* Release locks. */ flock($serverTextFilename, LOCK_UN); flock($shadowFilename, LOCK_UN); echo formatJSEND('success', $patchFromServer); break; default: exit(formatJSEND('error', 'Unknown Action ' . $_POST['action'])); } /* $filename must contain only the basename of the file. */ function isUserRegisteredForFile($user, $filename) { $marker = BASE_PATH . '/data/' . str_replace('/', '_', $filename) . '%%' . $user . '%%registered'; return file_exists($marker); } /* $filename must contain only the basename of the file. */ function getRegisteredUsersForFile($filename) { $usernames = array(); $markers = getMarkerFilesForFilename($filename); if (!empty($markers)) { foreach ($markers as $entry) { if (strpos($entry, 'registered')) { /* $entry is a marker file marking a registered user. * Extract the user name from the filename. */ $matches = array(); $entry = substr($entry, 0, strlen($entry) - 12); // Remove '%%registered' from $entry. preg_match('/\w+$/', $entry, $matches); if (count($matches) !== 1) { exit(formatJSEND('error', 'Unable To Match Username in getMarkerFilesForFilename')); } $usernames[] = $matches[0]; } } } return $usernames; } /* Return all marker files related to $filename. $filename must contain * only the basename of the file. */ function getMarkerFilesForFilename($filename) { $markers = array(); $basePath = BASE_PATH . '/data/'; if ($handle = opendir($basePath)) { $sanitizedFilename = str_replace('/', '_', $filename); while (false !== ($entry = readdir($handle))) { if (strpos($entry, $sanitizedFilename) !== false) { $markers[] = $entry; } } } return $markers; } /* Return the selection object, if any, for the given filename and user. * $filename must contain only the basename of the file. */ function getSelection($filename, $user) { $sanitizedFilename = str_replace('/', '_', $filename); $json = getJSON($sanitizedFilename . '%%' . $user . '%%selection'); return $json; } /* Return the list of changes, if any, for the given filename, user and * from the given revision number. * $filename must contain only the basename of the file. */ function getChanges($filename, $user, $fromRevision) { $sanitizedFilename = str_replace('/', '_', $filename); $json = getJSON($sanitizedFilename . '%%' . $user . '%%changes'); /* print_r(array_slice($json, $fromRevision, NULL, true)); */ return array_slice($json, $fromRevision, NULL, true); } /* Set the server shadow acquiring an exclusive lock on the file. $shadow * is a string. */ function setShadow($filename, $username, $shadow) { $sanitizedFilename = BASE_PATH . '/data/' . str_replace('/', '_', $filename) . '%%' . $username . '%%shadow'; file_put_contents($sanitizedFilename, $shadow, LOCK_EX); } /* Return the shadow for the given filename as a string or an empty string * if no shadow exists. */ function getShadow($filename) { $shadow = ''; $markers = getMarkerFilesForFilename($filename); if (!empty($markers)) { foreach ($markers as $entry) { if (strpos($entry, 'shadow')) { $shadow = file_get_contents($entry); print_r($shadow); } } } return $shadow; } function existsServerText($filename) { $sanitizedFilename = BASE_PATH . '/data/' . str_replace('/', '_', $filename) . '%%text'; return file_exists($sanitizedFilename); } /* Set the server text acquiring an exclusive lock on the file. $serverText * is a string. */ function setServerText($filename, $serverText) { $sanitizedFilename = BASE_PATH . '/data/' . str_replace('/', '_', $filename) . '%%text'; file_put_contents($sanitizedFilename, $serverText, LOCK_EX); } /* Return the server text for the given filename as a string or an empty string * if no server text exists. */ function getServerText($filename) { $serverText = ''; $markers = getMarkerFilesForFilename($filename); if (!empty($markers)) { foreach ($markers as $entry) { if (strpos($entry, 'text')) { $serverText = file_get_contents($entry); print_r($serverText); } } } return $serverText; } ?>