Как Работает Notesmimeentity?

Тема в разделе "Lotus - Программирование", создана пользователем seoman2, 9 апр 2014.

  1. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Не могу понять, как работает класс NotesMIMEEntity.
    Вопросы:
    1. Set mime = doc.GetMIMEEntity - с какого хранилища (поля) ищется MIME объект?
    2. Как правильно в доке перебрать все mime объекты?

    Set mime = doc.GetMIMEEntity
    If Not(mime Is Nothing) Then
    text = mime.contentastext
    Print text
    End If

    3. Как создать mime объект и отобразить его на форме?
    Dim doc As NotesDocument
    Set uidoc =uiworkspace.CurrentDocument
    Set doc =uidoc.Document
    Dim html As Variant
    session.convertmime=False
    Dim stream As NotesStream
    Set stream = session.CreateStream
    Call stream.WriteText("Здесь <b>можно</b> использовать <font color=red>HTML</font>")
    Dim mime As NotesMIMEEntity
    Set mime = doc.CreateMIMEEntity
    Dim header As NotesMIMEHeader
    Set header = mime.CreateHeader("headermime")
    Call header.SetHeaderVal("text Header")
    Call mime.SetContentFromText (stream, "text/plain;charset=UTF-8", ENC_BASE64)
    Call doc.Save(True, True)

    4. Если у поля в свойствах поставить галочку store contents as HTML and MIME, то в свойствах дока видно, что создается месколько объектов с именем поля.

    5. Где бы почитать ликбез по миме:? ))
     
  2. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    традиционно http://ru.wikipedia.org/wiki/MIME
    читаем RFC...
    текст кодируется в base64 (ибо мультиязычность предполагает знаков боле чем в ASCII)
    смотрим в гугл, на предмет примеров по нотусне
    на интертрасте есть примеры, там в поиске
     
  3. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
  4. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
  5. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    А как удалить определенный MIME объект?
    Я так понял, что для каждого объекта созадется поле body ?
     
  6. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    а зачем?
     
  7. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Я хочу большие EMBED_ATTACHMENT кодировать в Base64 и передать в строку.
    Мой план: выгрузить на винт вложение -> NotesStream -> mime.EncodeContent(ENC_BASE64) -> string$
     
  8. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    бр-р-р
    есть куча вариантов как закодировать в base64...
    http://www.nsftools.com/tips/NotesTips.htm#lsencryption
    но остался вопрос - зачем стринг в таком виде
    задачу надо рассказывать полностью

    Добавлено: да и вовсе нет нужды аттач выгружать на диск
    если DXL использвать - он уже получится base64
     
  9. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Надо документс вложениями выгрузить в XML определенного формата. XML-ку формирую текстовой строкой.
    C Base64 LS2J вызвать функцию EncodeBase64 (stream As NotesStream) As String - че то не получается вызвать её.
     
  10. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    Создаем XSLT и запущаем трансформер для DXL...
    и не получится ;) в бридж низя пихать нотусевые объекты, стринг - можно (есть и такой вариант в java - его и пользуйте)
    НО, для оглашенной задачи - используем первый путь - DXL
     
  11. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    EncodeBase64 (stream As NotesStream) - функция получает stream?
    А как мне вложение как стринг передать?
    Dim bc As Base64Converter
    Set bc=New Base64Converter
    ' With bc
    xxx$ = .EncodeBase64(inStream.ReadText())
     
  12. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    повторю еще раз - если цель XML - то надо использовать XSLT!
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    для преобразования body (обычного) в html, <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"писался код"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    Public DXLobj As DXLprocessing

    Private ses As NotesSession
    Private wks As NotesUIWorkspace
    Private db As NotesDatabase

    Private Const LIST_SEP={:}

    Private Const attachBody={attachBody}
    Private Const htmlTransform={HTMLTransform}
    Private Const RT_FIELDS={attachBody:htmlTransform}
    Private rtFields As Variant

    '************************************************
    '************************************************
    Class DXLprocessingBase As ErrorHandler
    Private DOM_off As Boolean
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub New(transformOnly As Boolean)
    DOM_off=transformOnly
    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function ApplyXSLT(doc As NotesDocument, ss As String) As NotesStream
    On Error Goto ErrH
    Dim lsTimer As New LsTimer()
    Call lsTimer.StartTimer()
    Dim XML_in As NotesStream
    Dim XML_out As NotesStream  ' output file
    Dim out_obj As NotesXMLProcessor

    'удаляем все "вспомогательные" РТ поля и вложения      
    Forall m In rtFields
    If doc.HasItem(Cstr(m)) Then doc.RemoveItem(Cstr(m)):Print {Remove} & Cstr(m):Call doc.Save(True,False)
    End Forall

    Set XML_in=ses.CreateStream
    Set XML_out=ses.CreateStream
    XML_out.Truncate

    Dim transformer As NotesXSLTransformer

    On Error lsERR_NOTES_XSLT_INPUT_OBJECT Goto err_IN
    On Error lsERR_NOTES_XSLT_OUTPUT_OBJECT Goto err_OUT
    On Error lsERR_NOTES_XSLT_STYLESHEET_OBJECT Goto err_SS
    On Error lsERR_NOTES_DXLEXPORTER_INPUT_OBJECT Goto err_DXLIN

    Set transformer=ses.CreateXSLTransformer
    Dim xslt As NotesStream
    Set xslt = ses.CreateStream
    Call xslt.Truncate

    Call xslt.WriteText(ss) 'экономит время, но непредсказуемое форматирование вывода
    'убираем все переносы строк, чтобы форматирование XSL не накладывалось на результат
    'Call xslt.WriteText(Replace(ss,Split(Chr(10) & {:} & Chr(13),{:}),{}))
    '       Print {XSLT size:} & Cstr(xslt.Bytes)
    'таблица преобразований
    Call transformer.SetStylesheet(xslt)
    Call transformer.SetOutput(XML_out)
    Set out_obj=transformer'для будущих вариантов обработки

    If Not DOM_off Then
    'включаем в цепочку DOM parser - для обработки в PostParse
    Dim docDOM As NotesDOMParser
    Set docDOM=ses.CreateDOMParser
    Call docDOM.SetOutput(out_obj)
    On Event PostDOMParse From docDOM Call postParse
    Set out_obj=docDOM'для будущих вариантов обработки
    End If

    Dim exporter As NotesDXLExporter
    Set exporter=ses.CreateDxlExporter(doc, out_obj)
    exporter.ConvertNotesbitmapsToGIF=True

    '   Dim importer As NotesDXLImporter
    '   Set importer=ses.CreateDXLImporter(transformer, XML_out)
    '   importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE

    Print {Processing to stream...}
    Call exporter.Process
    Call RTprocessing(doc, XML_out)
    Call lsTimer.StopTimer()
    Print Getthreadinfo(1) & { - elapsed time:}Format(lsTimer.GetSecondsLapsed(), "0.000")
    'выводим результат
    Set ApplyXSLT=XML_out

    Quit:
    Exit Function
    err_IN:
    Print "XSL Input error:XSLTransformer Process"
    RaiseError
    Resume Quit
    err_OUT:
    Print "XSL Output error:XSLTransformer Process"
    RaiseError
    Resume Quit
    err_SS:
    Print "Style Sheet error:XSLTransformer Process"
    RaiseError
    Resume Quit
    err_DXLIN:
    Print "DXL input Object error"
    ErrH:
    RaiseError
    If (Not transformer Is Nothing) Then If Len(transformer.Log) > 0 Then Msgbox transformer.Log
    Resume Quit
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub RTprocessing    (doc As NotesDocument, xml As NotesStream)

    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub postParse(xml As NotesDOMParser)

    End Sub
    End Class

    '************************************************
    '************************************************
    Class DXLprocessing As DXLprocessingBase
    Private attachments List As String
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub New(), DXLprocessingBase(False)

    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub RTprocessing    (doc As NotesDocument, xml As NotesStream)
    Dim lsTimer As New LsTimer()
    Call lsTimer.StartTimer()
    Print {Processing to RT...}
    'добавляем вложения (получены в PostParse)
    Dim rt As NotesRichTextItem
    Set rt=doc.CreateRichTextItem(attachBody)
    rt.IsProtected=False
    rt.IsEncrypted=False
    rt.IsSigned=False
    rt.IsSummary=False
    Forall a In attachments
    Call AddAttachment(a, doc, attachBody)
    Call DeleteFile(a)
    'Print {attach:} & a
    End Forall

    'результат кладём в РТ поле
    Dim buff As New StringBuffer(DEF_BUFFER)
    xml.Position=0
    Do
    buff.Append(xml.ReadText)
    Loop Until xml.IsEOS

    Call doc.ReplaceItemValue({Form}, {mainnotes})
    Dim item As NotesItem
    Set item=doc.ReplaceItemValue(htmlTransform, buff.toString)
    item.IsSummary=True
    Call doc.ComputeWithForm(False, False)

    Call doc.Save(True, True)
    Call lsTimer.StopTimer()
    Print Getthreadinfo(1) & { - elapsed time:}Format(lsTimer.GetSecondsLapsed(), "0.000")
    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'обработка без наложения XSLT
    Function ReplaceAttachDOM(doc As NotesDocument) As NotesStream
    Dim docDOM As NotesDOMParser
    Dim exporter As NotesDXLExporter
    Dim importer As NotesDXLImporter

    On Error Goto ErrH
    Forall m In rtFields
    If doc.HasItem(Cstr(m)) Then doc.RemoveItem(Cstr(m)):Call doc.Save(True,False)
    End Forall

    Dim XML_out As NotesStream
    Set XML_out=ses.CreateStream
    XML_out.Truncate

    Set docDOM=ses.CreateDOMParser
    Call docDOM.SetOutput(XML_out)
    'здесь будут выдёргиваться вложения и меняться DXL
    On Event PostDOMParse From docDOM Call postParse

    Set exporter=ses.CreateDXLExporter(doc,docDOM)
    exporter.ConvertNotesbitmapsToGIF=True

    '   Set importer=ses.CreateDXLImporter(docDOM,db)
    '   importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
    Set ReplaceAttachDOM=XML_out
    Quit:
    Exit Function
    ErrH:
    RaiseError
    Resume Quit
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub postParse(xml As NotesDOMParser)
    On Error Goto ErrH
    Dim lsTimer As New LsTimer()
    Call lsTimer.StartTimer()
    Dim root As NotesDOMDocumentNode
    Dim nodeList As NotesDOMNodeList
    Dim node As NotesDOMElementNode

    Erase attachments
    Dim embViewNode As NotesDOMElementNode

    Set root=xml.Document
    Set nodeList=root.GetElementsByTagName("noteinfo")

    Dim fname As String
    Set node=nodeList.GetItem(1)
    fname=node.GetAttribute({noteid})

    Dim path As String
    'совместимость в ОС
    path=Replace(ses.GetEnvironmentString("Directory", True), {\}, {/}) & {/} & fname
    'path=ses.GetEnvironmentString("Directory", True) & {/} & fname

    Set nodeList=root.GetElementsByTagName("picture")
    Dim i As Long
    For i=1 To nodeList.NumberOfEntries
    Set node=nodeList.GetItem(i)
    If node.HasChildNodes Then
    Dim ext As String
    ext={}
    Dim imgnode As NotesDOMElementNode
    Set imgnode=node.FirstChild
    Print {image type:} & imgnode.TagName
    Select Case Ucase(imgnode.TagName)
    Case {JPEG}:ext={.jpg}
    Case {GIF}:ext={.gif}
    Case {CGM}:ext={.cgm}
    Case Else:
    ext={}
    End Select
    Dim part As String
    part= Cstr(i) & ext
    Dim out As NotesStream
    Set out=ses.CreateStream
    Dim encpath As String
    encpath=path & Cstr(i) & {enc64}
    If out.Open(encpath, {UTF-8}) Then
    out.Position=0
    Call out.Truncate
    Dim s As String
    s=imgnode.FirstChild.NodeValue
    Print {Base64 len:}Cstr(Len(s))
    Call out.WriteText(s)
    Call out.Close()
    Call Base64Obj.DecodeFileToFile(encpath, path & part)
    Call DeleteFile(encpath)
    imgnode.FirstChild.NodeValue=fname & part
    attachments(fname & part)=path & part
    Else
    Print {Failed to open:} & encpath
    End If

    '           Do While Not Isnull(imgnode)
    '               Set imgnode=imgnode.NextSibling
    '           Loop
    End If
    Next
    Call xml.Serialize
    Call lsTimer.StopTimer()
    Print Getthreadinfo(1) & { - elapsed time:}Format(lsTimer.GetSecondsLapsed(), "0.000")
    Quit:
    Exit Sub
    ErrH:
    RaiseError
    Resume Quit
    End Sub
    End Class
    основная ф-ция класса и делает трансформацию дока на основе XSLT (по коду - ss)
    дополнительно обрабат. результат на нек. замены (постпроцессинг)
    нужен только базовый класс, в производном реализация записи в РТ наспех слеплена и зависит от постпроцесса, оставил на посмотреть :)
     
  14. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    т.е. в базе, даже без постпроцесса - накладывается таблица преобразования на DXL дока, т.о. можем получить что угодно
     
Загрузка...

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