<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="sw_XMLMetaImporter" script:language="StarBasic">


'*************************************************************************
'
'  Licensed to the Apache Software Foundation (ASF) under one
'  or more contributor license agreements.  See the NOTICE file
'  distributed with this work for additional information
'  regarding copyright ownership.  The ASF licenses this file
'  to you under the Apache License, Version 2.0 (the
'  "License"); you may not use this file except in compliance
'  with the License.  You may obtain a copy of the License at
'  
'    http://www.apache.org/licenses/LICENSE-2.0
'  
'  Unless required by applicable law or agreed to in writing,
'  software distributed under the License is distributed on an
'  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
'  KIND, either express or implied.  See the License for the
'  specific language governing permissions and limitations
'  under the License.
'
'*************************************************************************





' Be sure that all variables are dimensioned:
option explicit


' REQUIRED VARIABLES for interface/service tests:

' Required for com.sun.star.xml.sax.XDocumentHandler
  Global vXMLData As Variant

' Required for procedure CheckImport
  Global sTitle As String

' Required for  com.sun.star.document.XImporter:
  Global oSrcDocument As Object


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' sw.XMLMetaImporter
'*************************************************************************
On Error Goto ErrHndl
    oDoc = utils.createDocument("swriter", cObjectName)
    oObj = createUnoService("com.sun.star.comp.Writer.XMLImporter")

    oSrcDocument = oDoc
    oObj.setTargetDocument(oDoc)

    sTitle = "XMLMetaImporter test"
    vXMLData = Array( _
            Array("start", "office:document-meta" , _
                "xmlns:office", "CDATA", "http://openoffice.org/2000/office", _
                "xmlns:dc", "CDATA", "http://purl.org/dc/elements/1.1/"), _
            Array("start", "office:meta"), _
            Array("start", "dc:title"), _
            Array("chars", sTitle),  _
            Array("end", "dc:title"), _
            Array("end", "office:meta"), _
            Array("end", "office:document-meta"))
Exit Sub
ErrHndl:
    Test.Exception()
End Sub

Function CheckImport() As Boolean
    Dim res As Boolean
    Dim oDocInfo As Object
    Dim title As String
    out.log("checking of import...")
    oDocInfo = oDoc.getDocumentInfo()
    title = oDocInfo.getPropertyValue("Title")
    res = (title = sTitle)
    out.log("checking result: " + res)
    CheckImport() = res
End Function
</script:module>
