как подписать Button на Rich Text Item

Тема в разделе "Lotus - Программирование", создана пользователем Vvv, 23 мар 2011.

  1. Vvv

    Vvv Гость

    Подскажите пожалуйста как можно подписать button (horspot) на rich text item
    item не имеет секций
    устанавливал IsSigned = True и подписывал item и note
    все равно при нажатии на кнопку появляеться диалог доверять или нет автору кнопки а не пользователю которым пытался подписывать
     
  2. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Вот порос так вопрос ;)
    Код желательно подписывать сервером. Тогда подобного диалога не будет
     
  3. Vvv

    Vvv Гость

    создаю вторую тестовую кнопку под юзером которым пользовался для подписи
    диалога не появляеться, те необязательно подписывать сервером

    в моем случаи что появляеться диалог плохо но не критично
    у меня не получаеться так подписать базу документы что бы появлялся диалог на доверя пользователю под которым подписывали а не автора кнопки (3 разных человека делали документы надо что бы они все были подписанны одним лицом)
     
  4. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ты делаешь цифровую подпись RT-поля? Или что ты хочешь сделать?
    А то то что ты пишешь - набор слов
     
  5. Vvv

    Vvv Гость

    Ты делаешь цифровую подпись RT-поля?

    да я делаю цифровую подпись RT-поля

    я нашел упоминание о проблемме подписи кнопки в документе
    http://www.domblog.de/domblog.nsf/d6plinks/JPOR-6ADBJ2

    связался с этим Rod он говорит что исходников у него уже нет, прототип для NSFMemorySign он непомнит
     
  6. Vvv

    Vvv Гость

    есть вот такая функция которая должна решить проблемму NSFNoteSignHotspots
    но чего то она не помогает
     
  7. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    чего делали, где пример вызова?
     
  8. Vvv

    Vvv Гость

    NSFSearch выбрал документы с Form="MyForm"
    для каждой ноты вызвал NSFNoteSignHotspots с
    hNote
    флаг 0
    ссылка на флаг была note подписанна или нет (в 70% возращает что была)
    эфекта нет все равно появляеться диалог доверять автору кнопки а не кем подписывал

    на форуме на ibm нашел что народ жалуеться у них тоже эта функция не помогла
     
  9. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    не верю(с). где пример вызова?
    поменяю мой рабочий код на ваш нерабочий...
     
  10. Vvv

    Vvv Гость

    STATUS SignElements(DBHANDLE hDB)
    {
    STATUS error = NOERROR;

    // error = SignDataNotes(hDB, NOTE_ID_SPECIAL | NOTE_CLASS_DESIGN, TRUE);
    error = SignDataNotes(hDB, NOTE_CLASS_PRIVATE | NOTE_CLASS_FILTER, TRUE);
    error = SignDataNotes(hDB, NOTE_CLASS_ICON, TRUE);
    error = SignDataNotes(hDB, NOTE_CLASS_HELP, TRUE);

    error = SignDataNotes(hDB, NOTE_CLASS_DATA, TRUE);

    return error;
    }

    /************************************************************************

    FUNCTION: SignDataNotes

    This function exports a set of notes based on the Note Class(es)
    specified. (NOTE_CLASS_xxx)

    *************************************************************************/
    STATUS LNPUBLIC SignDataNotes(DBHANDLE hDB, WORD wNoteClassMask, BOOL bDesignNotes)
    {
    STATUS error = NOERROR;
    HANDLE hNoteIDTable; /* table of Note IDs to modify */


    /*
    * Need to set up an ID Table which will contain a list of Note IDs that are to be exported.
    */
    if (error = IDCreateTable(sizeof(NOTEID), &hNoteIDTable))
    return(error);

    /*
    * Call NSFSearch to find the notes that match the note classes we would like to export.
    * For each note found, the routine AddIdUnique is called.
    */

    if (error = NSFSearch(hDB, /* database handle */
    NULLHANDLE, /* selection formula */
    NULL, /* title of view in selection formula */
    0, /* search flags */
    wNoteClassMask, /* note class to find */
    NULL, /* starting date (unused) */
    AddIDUnique, /* call for each note found */
    &hNoteIDTable, /* argument to AddIDUnique */
    NULL)) /* returned ending date (unused) */

    {
    IDDestroyTable(hNoteIDTable);
    return(error);
    }

    if (error = IDEnumerate(hNoteIDTable, Processnote, hDB))
    {
    IDDestroyTable(hNoteIDTable);
    return(error);
    }

    /*
    * Free the memory containing the ID table
    */
    IDDestroyTable(hNoteIDTable);

    return (error);
    }

    /************************************************************************

    FUNCTION: AddIDUnique

    *************************************************************************/
    STATUS LNPUBLIC AddIDUnique(void far * phNoteIDTable, SEARCH_MATCH far *pSearchMatch, ITEM_TABLE far *summary_info)
    {
    SEARCH_MATCH SearchMatch;
    HANDLE hNoteIDTable;
    STATUS error;
    BOOL flagOK;

    memcpy( (char*)&SearchMatch, (char*)pSearchMatch, sizeof(SEARCH_MATCH) );

    /* if (SearchMatch.MatchesFormula != SE_FMATCH) V3 */
    if (!(SearchMatch.SERetFlags & SE_FMATCH)) /* V4 */
    return (NOERROR);

    hNoteIDTable = *((HANDLE far *)phNoteIDTable);

    error = IDInsert(hNoteIDTable, SearchMatch.ID.NoteID, &flagOK);

    return (NOERROR);
    }

    /************************************************************************

    FUNCTION: Processnote

    PURPOSE:

    INPUTS:

    *************************************************************************/

    STATUS LNCALLBACK Processnote(void far *hDB, NOTEID NoteId)
    {
    STATUS error = NOERROR;
    NOTEHANDLE hNote = NULLHANDLE;

    BOOL retfSigned = FALSE;


    //Open the Note.
    if (error = NSFNoteOpen(hDB, //database handle
    NoteId, //Note ID
    OPEN_EXPAND, //open flags
    &hNote))
    {
    return (ERR(error));
    }

    error = NSFNoteUnsign(hNote);
    error = NSFNoteSignHotspots(hNote, 0, &retfSigned);
    printf("%i\n", retfSigned);
    if (error = NSFNoteSign(hNote))
    {
    goto Exit0;
    }

    if (error = NSFNoteUpdate(hNote, UPDATE_FORCE))
    return (ERR(error));

    Exit0:

    //close note
    if (error = NSFNoteClose(hNote))
    return (ERR(error));

    return error;
    }
     
  11. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">sign hotspots</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Declare Function NSFNoteSignHotspots Lib "nnotes.dll" ( Byval hNote As Long, Byval dwFlags As Long , Byval retfSigned As Integer) As Integer
    Declare Function NSFNoteUpdate Lib "nnotes.dll" (Byval hNote As Long, Byval flags As Integer) As Integer

    ''  USAGE:
    ''  Dim signer As New HotSpotSigner(doc)
    ''  Call signer.sign()
    Class HotSpotSigner

    Private t_doc As NotesDocument
    Private t_db As NotesDatabase
    Private t_unid As String

    Sub new( i_doc As NotesDocument )
    Set t_doc = i_doc
    Set t_db = i_doc.ParentDatabase
    t_unid = i_doc.UniversalID
    End Sub


    Sub sign()
    ' сбрасываем подписи, выполняя экспорт-импорт в DXL
    Call reexport()
    ' собственно подписывам хотспоты
    Call signHotSpots()

    '** a little trick to avoid this message on recompiled forms:
    '** This document has been altered since the last time it was signed! Intentional tampering may have occurred.
    Call reopenDocFromFromDisk()       
    Call t_doc.Sign()
    Call t_doc.Save(True, False)
    End Sub

    ' экспорт, и тут же импорт документа. сбрасывает подписи в хотспотах.
    Private Sub reexport()
    Dim session As New NotesSession
    Dim stream As NotesStream
    Set stream = session.CreateStream

    Dim exporter As NotesDXLExporter
    Set exporter = session.CreateDXLExporter
    Call exporter.SetInput( t_doc)
    Call exporter.SetOutput(stream)
    Call exporter.Process

    Dim importer As NotesDXLImporter
    Set importer = session.CreateDXLImporter(stream, t_db )
    importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
    Call importer.Process

    Call reopenDocFromFromDisk()
    End Sub

    Private Sub signHotSpots
    If NSFNoteSignHotspots( t_doc.Handle , 0 , False ) <> 0 Then
    Error 1001 , "Cannot sign: "
    End If
    If NSFNoteUpdate( t_doc.Handle , 0) <> 0 Then
    Error 1001 , "Cannot save: "
    End If
    End Sub

    ' update in-memory reference to document
    Private Sub reopenDocFromFromDisk()
    Delete t_doc
    Set t_doc = t_db.GetDocumentByUNID(t_unid)
    End Sub
    End Class
    winxp32, клиент 703. полет нормальный.
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    turumbay там код на Сях... (должен быть)
    потому вопрос несколько сложнее :)
     
  13. Vvv

    Vvv Гость

    turumbay большое спасибо за помощь
    код работает

    основная ошибка после error = NSFNoteUnsign(hNote); надо переоткрыть Note
    как допилю код сюда напишу - с подписями в help есть ошибка в примере и пару неточностей которые делают примеры нерабочими для общего случая подписи базы (на LS вы эти грабли обшли тк писали часть кода на LS)
    вообщем Notes он такой Notes блин
     
  14. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    в сях я не копенгаген.
    но подозреваю, что реальный сишник разберется как переписать: суть происходящего в целом понятна.
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    полагаю Сергей разберётся...
    но у меня ощущ "сложностей" реализации в Сях именно через ДХЛ
     
  16. Vvv

    Vvv Гость

    DXL export/import на Си не глобальная проблемма я делал до этого (мы делали через dxl экспорт из Notes в Word 2003)
    у меня с этой библиотекой возникла проблемма примерно у 3 из 25 документов HotSpot не подписываються корректно (те всеравно появляеться диалог доверять автору а не пользователю кем я подписываю)
    криминала с этими документами не вижу

    это агент с которым я эксперментирую
    колекция ломаеться тк документы пересоздаються поэтому сделал два цикла

    %REM
    Agent Sign
    Created Mar 25, 2011 by superuser/pts
    Description: Comments for Agent
    %END REM
    Option Public
    Option Declare

    Declare Function NSFNoteSignHotspots Lib "nnotes.dll" ( ByVal hNote As Long, ByVal dwFlags As Long , ByVal retfSigned As Integer) As Integer
    Declare Function NSFNoteUpdate Lib "nnotes.dll" (ByVal hNote As Long, ByVal flags As Integer) As Integer

    '' USAGE:
    '' Dim signer As New HotSpotSigner(doc)
    '' Call signer.sign()
    Class HotSpotSigner

    Private t_doc As NotesDocument
    Private t_db As NotesDatabase
    Private t_unid As String

    Sub New( i_doc As NotesDocument )
    Set t_doc = i_doc
    Set t_db = i_doc.ParentDatabase
    t_unid = i_doc.UniversalID
    End Sub


    Sub sign()
    ' сбрасываем подписи, выполняя экспорт-импорт в DXL
    Call reexport()
    ' собственно подписывам хотспоты
    Call signHotSpots()

    '** a little trick to avoid this message on recompiled forms:
    '** This document has been altered since the last time it was signed! Intentional tampering may have occurred.
    Call reopenDocFromFromDisk()
    Call t_doc.Sign()
    Call t_doc.Save(True, False)
    End Sub

    ' экспорт, и тут же импорт документа. сбрасывает подписи в хотспотах.
    Private Sub reexport()
    Dim session As New NotesSession
    Dim stream As NotesStream
    Set stream = session.CreateStream

    Dim exporter As NotesDXLExporter
    Set exporter = session.CreateDXLExporter
    Call exporter.SetInput( t_doc)
    Call exporter.SetOutput(stream)
    Call exporter.Process

    Dim importer As NotesDXLImporter
    Set importer = session.CreateDXLImporter(stream, t_db )
    importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
    Call importer.Process

    Call reopenDocFromFromDisk()
    End Sub

    Private Sub signHotSpots
    If NSFNoteSignHotspots( t_doc.Handle , 0 , False ) <> 0 Then
    MsgBox "Cannot sign: "
    End If
    If NSFNoteUpdate( t_doc.Handle , 0) <> 0 Then
    MsgBox "Cannot save: "
    End If
    End Sub

    ' update in-memory reference to document
    Private Sub reopenDocFromFromDisk()
    Delete t_doc
    Set t_doc = t_db.GetDocumentByUNID(t_unid)
    End Sub
    End Class
    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim collection As NotesDocumentCollection
    Dim doc As NotesDocument
    Dim unidArr() As String
    Dim i As integer

    i = 0

    Set db = session.CurrentDatabase
    Set collection = db.AllDocuments
    Set doc = collection.GetFirstDocument()
    While Not(doc Is Nothing)
    ReDim Preserve unidArr(i)
    unidArr(i) = doc.Universalid
    i = i + 1
    Set doc = collection.GetNextDocument(doc)
    Wend

    forAll unid In unidArr
    Dim hss As HotSpotSigner
    Set doc = db.Getdocumentbyunid(unid)
    Set hss = New HotSpotSigner(doc)
    Call hss.sign()
    End ForAll

    MsgBox "Test"

    End Sub
     
  17. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    после dxl импорта существующие подписи должны слетать. наличие диалога "доверять автору" - признак того, что не прошел импорт... м.б. поиграть опциями импортера?
    updated а чтоб коллекция не ломалась - нужно сразу получать ссылку на следующий док
    Код (Text):
    while not doc is nothing
    Set nextDoc = collection.getNextDocument(doc )
    '' any operation with doc
    Set doc = nextDoc
    wend
     
Загрузка...

Поделиться этой страницей