Поделиться через


Блокировки документов

Протокол блокировки документов

Чтобы запросить блокировку документа для приложений на основе 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.

Текстовые хранилища

ITextStoreACP::RequestLock

ITextStoreACPSink::OnLockGranted

ITextStoreACP::GetText

ITextStoreAnchor::RequestLock

ITextStoreAnchorSink::OnLockGranted

ITextStoreAnchor::GetText