Блокировки документов
Протокол блокировки документов
Чтобы запросить блокировку документа для приложений на основе ACP, диспетчер TSF вызывает ITextStoreACP::RequestLock. Для приложений на основе привязки диспетчер TSF вызывает ITextStoreAnchor::RequestLock. Приложение предоставляет блокировку документа, вызывая ITextStoreACPSink::OnLockGranted (приложения на основе ACP) или ITextStoreAnchorSink::OnLockGranted (приложения на основе привязки) внутри RequestLock. Блокировка действительна только во время вызова OnLockGranted . При возврате OnLockGranted документ считается незаблокированным.
Типы блокировок документов
Существует два типа блокировок документов: только для чтения и чтения и записи. Блокировка только для чтения позволяет руководителю читать текст, но он не может изменять или вставлять текст. Блокировка чтения и записи позволяет руководителю считывать, изменять и вставлять текст. Блокировка только для чтения запрашивается путем указания TS_LF_READ в dwFlags. Блокировка чтения и записи запрашивается путем указания TS_LF_READWRITE в dwFlags.
Асинхронные и синхронные запросы
Запрос на блокировку может быть синхронным или асинхронным. Руководитель запрашивает синхронную блокировку с помощью флага TS_LF_SYNC в dwFlags. Если этот флаг отсутствует, запрос является асинхронным.
Предоставление блокировки
При вызове RequestLock приложение должно определить, заблокирован ли документ в данный момент. Если документ не заблокирован и нет других причин для запрета блокировки, приложение должно задать для phrSession значение S_OK и вернуть S_OK.
Если документ заблокирован, а запрос на блокировку синхронный, приложение должно задать для phrSession значение TS_E_SYNCHRONOUS и вернуть S_OK. Это означает, что синхронный запрос не может быть предоставлен.
Если документ заблокирован, а запрос на блокировку является асинхронным, приложение должно поставить запрос в очередь, задать для phrSession значение TS_S_ASYNC и вернуть S_OK. Когда документ станет доступным, приложение должно удалить запрос из очереди и вызвать OnLockGranted. Такая постановка в очередь запросов на блокировку является необязательной; Существует один сценарий, который должно поддерживать приложение. Если в документе есть блокировка только для чтения, новый запрос блокировки выполняется для чтения и записи, а запрос является асинхронным, приложение вызвало OnLockGranted , что вызвало повторный вызов RequestLock. Приложение должно задать для параметра phrSession значение TS_S_ASYNC и вернуть S_OK. После возврата вызова OnLockGranted приложение должно обработать запрос на обновление, снова вызвав OnLockGranted с TS_LF_READWRITE.
Принудительное применение блокировки
Прежде чем разрешить доступ к документу, приложение должно убедиться, что существует соответствующий тип блокировки. Например, приложение должно убедиться, что в документе есть по крайней мере блокировка только для чтения, прежде чем разрешить продолжение ITextStoreACP::GetText или ITextStoreAnchor::GetText . Если соответствующая блокировка не существует, приложение должно вернуть TF_E_NOLOCK.
Связанные темы