Kirjautuminen

Haku

Tehtävät

Kilpailu

Putka Open 2025
Alkuerät ovat ohi.

Keskustelu: Koodit: WebDAV härpäke LibreOffice Basic ympäristössä

neosofta [01.12.2025 00:08:17]

#

Kirjaudu sisään (luo tili) osoitteessa:
https://www.webdavsystem.com/

Sinun ei tarvitse ladata mitään, valitse vain 72 tunnin testipalvelu.

Saat henkilökohtaisen tilisi: https://webdavserver.net/UserXXXXXXX
missä XXXXXXX on numero-/merkkisarja

Tämä on demopalvelin WebDAV Server Engine .NET and WebDAV Ajax -kirjastoja varten.

Testikansio luodaan (https://webdavserver.net/UserXXXXXXX)
Voit käyttää sitä esimerkiksi verkkoaseman yhdistämiseen
Huomaa, että kansio jonka luot itse ja kaikki siinä olevat tiedostot poistetaan 72 tunnin kuluessa. Voit jatkaa testaamista vielä tämänkin jälkeen lataamalla palvelimelle uudestaan haluamasi tiedostot (en tiedä kuinka kauan).

Voit käyttää yllä olevaa URL-osoitetta WebDAV-palvelimen testaamiseen erilaisilla WebDAV-järjestelmillä.

REM  *****  BASIC  *****
REM Valintaikkunaan (Dialog1):
REM 1 TreeControl ohjausobjekti (TreeControl1)
REM 2 CheckBox ohjausobjektia (CheckBox1 & CheckBox2)
REM 1 CommandButton ohjausobjekti (CommandButton1)

Private oDlg As Object
Private oTreeControl As Object
Private oChk As Object
Private oChk2 As Object
Private Continue As Boolean
Private fileNames() As String
Private Aborted As Boolean

Sub ShowDialog

    If Continue Then Exit Sub

    DialogLibraries.LoadLibrary("Standard")
    oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    oTreeControl = oDlg.getControl("TreeControl1")
    oTreeControl.Model.SelectionType = 1
    oChk = oDlg.getControl("CheckBox1")
    oChk2 = oDlg.getControl("CheckBox2")
    Dim oListenerTop As Object
    oListenerTop=createUnoListener("TopListen_", "com.sun.star.awt.XTopWindowListener")
    oDlg.addTopWindowlistener(oListenerTop)

    Continue = True
    CenterDialog
    WebDAV_MKCOL
    WebDAV_PROPFIND
    PopulateTreeView

    Do while Continue
        Wait 20
        oDlg.setVisible(true)
    Loop

    oDlg = Nothing

End Sub

Sub TopListen_WindowClosing
    Continue=false
    ThisComponent.setModified(False)
End Sub
Sub  TopListen_windowOpened
End Sub
Sub  TopListen_windowClosed
End Sub
Sub TopListen_windowMinimized
End Sub
Sub  TopListen_windowNormalized
End Sub
Sub  TopListen_windowActivated
End Sub
Sub  TopListen_windowDeactivated
End Sub
Sub  TopListen_disposing
End Sub

Sub CenterDialog

    Dim oSize As New com.sun.star.awt.Size, factor As Double
    Dim oCC, oComponentWindow, oTopWindowPosSize
    oCC = ThisComponent.getCurrentController()
    oComponentWindow = oCC.ComponentWindow
    oTopWindowPosSize = oComponentWindow.Toolkit.ActiveTopWindow.getPosSize()

    oSize.Width = oDlg.Model.Width
    oSize.Height = oDlg.Model.Height
    factor = oSize.Width / oDlg.convertSizeToPixel(oSize, com.sun.star.util.MeasureUnit.APPFONT).Width

    With oDlg.Model
        .PositionX = (factor * oTopWindowPosSize.Width - .Width) / 2
        .PositionY = (factor * oTopWindowPosSize.Height - .Height) / 1.7
    End With

End Sub

Sub OpenRemoteFile(fName)

    url = "https://webdavserver.net/UserXXXXXXX/newfolder/" & fName 'Korvaa UserXXXXXXX omalla

    Dim pos As Integer, tmp As String, ext As String
    pos = InStrReverse(url, ".")
    tmp = Left(url, pos - 1)
    ext = Replace(url, tmp, "")
    Select Case ext
        Case ".ods", ".odt", ".odf", ".ott", ".odp", ".otp", ".fodp", ".fodg", "rtf", ".csv", ".txt"
            pos = InStrReverse(url, "/")
            tmp = Left(url, pos)
            fname = Replace(url, tmp, "")
            OpenRemoteFileDirect fname
            Exit Sub
        Case ".pdf"
            Dim oShellExec As Object
            oShellExec = CreateUnoService("com.sun.star.system.SystemShellExecute")
            oShellExec.execute(url, "", 0)
            oShellExec = Nothing
        Case Else
    End Select

End Sub

Sub OpenRemoteFileDirect(fname As String)

    Dim baseUrl As String
    baseUrl = "https://webdavserver.net/UserXXXXXXX/newfolder/" 'Korvaa UserXXXXXXX omalla
    Dim fullUrl As String
    fullUrl = baseUrl & fname

    Dim oDoc As Object
    oDoc = StarDesktop.loadComponentFromURL(fullUrl, "_blank", 0, Array())

End Sub

Sub WebDAV_MKCOL() 'Luo palvelimelle kansion newfolder jos sitä ei ole (ei luo uutta jos on).

    Dim sfa As Object
    sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    sfa.createFolder("https://webdavserver.net/UserXXXXXXX/newfolder/") 'Korvaa UserXXXXXXX omalla

End Sub

Sub WebDAV_PROPFIND()

    Dim sUrl As String, i As Integer
    url = "https://webdavserver.net/UserXXXXXXX/newfolder/" 'Korvaa UserXXXXXXX omalla

    Dim sfa As Object
    sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    Erase  fileNames

    If  sfa.Exists(url) Then
        Dim files()
        files = sfa.GetFolderContents(url, True)
        If UBound(files) < 0 Then
        	Print "No files in the specified folder"
        	Exit Sub
        End If

        Erase fileNames
        Redim fileNames(UBound(files))
        For i = LBound(files) To UBound(files)
            fileNames(i) = files(i)
        Next i

    End If

End Sub

Sub WebDAV_put

    Dim filepicker As Object, localFile As String, sFileArray As Variant
    filepicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
    filepicker.setDisplayDirectory(thisComponent.URL)
    filepicker.appendFilter("All files", "*.*")
    filepicker.setMultiSelectionMode(False)

    If filepicker.Execute() Then
        sFileArray = filepicker.getFiles()
        localFile = sFileArray(0)
    End If

    filepicker = Nothing

    If localFile = "" Then
        MsgBox "Operation aborted by user", "48", "Open" : Aborted = True : Exit Sub
    End If

    Dim url As String, ucb As Object, provider As Object, id As Object, content As Object
    Dim pos As Integer, tmp As String, fName As String

    pos = InStrReverse(localFile, "/")
    tmp = Left(localFile, pos)
    fName = Replace(localFile, tmp, "")

    url  = "https://webdavserver.net/UserXXXXXXX/newfolder/" & fName 'Korvaa UserXXXXXXX omalla
    ucb = CreateUnoService("com.sun.star.ucb.UniversalContentBroker")
    provider =  CreateUnoService("com.sun.star.ucb.WebDAVContentProvider")
    id = ucb.createContentIdentifier(url)
    content = provider.queryContent(id)

    Dim sfa As Object, inputStream As Object
    Dim args As Object, cmd As Object

    sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    inputStream = sfa.openFileRead(localFile)
    args = CreateUnoStruct("com.sun.star.ucb.InsertCommandArgument")
    args.Data = inputStream
    args.ReplaceExisting = True
    cmd = new com.sun.star.ucb.Command
    cmd.Name = "insert"
    cmd.Handle = -1
    cmd.Argument = args
    On Error Resume Next
    content.execute(cmd, 0, Nothing)
    If Err <> 0 Then Err.Clear
    inputStream.CloseInput()
    inputStream = Nothing
    sfa = Nothing
    content = Nothing
    id = Nothing
    provider = Nothing
    ubc = Nothing

End Sub

Sub WebDAV_get(fName As String)

    Dim url As String, ucb As Object, provider As Object, id As Object, content As Object
    url = "https://webdavserver.net/UserXXXXXXX/newfolder/" & fName 'Korvaa UserXXXXXXX omalla
    Dim pos As Integer, tmp As String, ext As String
    pos = InStrReverse(fName, ".")
    tmp = Left(fName, pos)
    ext = Replace(fName, tmp, "")

    ucb = CreateUnoService("com.sun.star.ucb.UniversalContentBroker")
    provider = CreateUnoService("com.sun.star.ucb.WebDAVContentProvider")
    id = ucb.createContentIdentifier(url)
    content = provider.queryContent(id)

    Dim args As Object, cmd As Object, pump As Object
    pump = CreateUnoService("com.sun.star.io.Pump")

    args = CreateUnoStruct("com.sun.star.ucb.OpenCommandArgument2")
    args.Mode = 2 'file
    args.Priority = 0
    args.Sink = pump

    cmd = CreateUnoStruct("com.sun.star.ucb.Command")
    cmd.Name = "open"
    cmd.Handle = -1
    cmd.Argument = args
    content.execute(cmd, 0, Nothing)

    Dim responseStream As Object
    responseStream = pump.getInputStream()

    Dim filepicker As Object, saveFile As String
    filepicker = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
    filepicker.initialize(Array(com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE))
    filepicker.setDisplayDirectory(thisComponent.URL)
    filepicker.appendFilter("All files", "*.*")
    filepicker.setMultiSelectionMode(False)

    If filepicker.Execute() Then
        sFileArray = filepicker.getFiles()
        localFile = sFileArray(0)
    End If

    filepicker = Nothing

    If localFile = "" Then
        MsgBox "Operation aborted by user", "48", "Open" : Goto Handler
    End If

    Dim bytes() As Byte
    responseStream.readBytes(bytes, responseStream.available)
    If InStr(localFile, ".") = 0 Then
        localFile = localFile & "." & ext
    End If

    Dim sfa As Object, outStream As Object
    sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
    outStream = sfa.openFileWrite(localFile)
    outStream.writeBytes(bytes)
    outStream.closeOutput()
    responseStream.closeInput()
    outStream = Nothing

Handler:
    responseStream = Nothing
    sfa = Nothing
    cmd = Nothing
    args = nothing
    pump = nothing
    content = Nothing
    provider = Nothing
    id = Nothing
    ucb = Nothing

End Sub

Sub PopulateTreeView

    If Ubound(fileNames) < 0 Then
        MsgBox "No files in the specified folder", "48", "Files"
        Exit Sub
    End If

    Dim oMutableTreeDataModel As Object
    Dim oRootNode As Object
    Dim oChildNode1 As Object
    Dim oSubChildNode() As Object

    Dim i As Long, pos As Long, tmp As String

    pos = InStrReverse(fileNames(0), "/")
    rootName = Left(fileNames(0), pos)

    oMutableTreeDataModel = CreateUnoService("com.sun.star.awt.tree.MutableTreeDataModel")
    oRootNode = oMutableTreeDataModel.createNode(rootName , False)
    oMutableTreeDataModel.setRoot(oRootNode)
    oChildNode1 = oMutableTreeDataModel.createNode("Files", False)
    oRootNode.appendChild(oChildNode1)
    ReDim oSubChildNode(Ubound(fileNames))
    Dim nodeName As String

    For i = Lbound(fileNames) To Ubound(fileNames)
     	pos = InStrReverse(fileNames(i), "/")
     	nodeName = Replace(fileNames(i), Left(fileNames(i), pos) , "")
    	oSubChildNode(i) = oMutableTreeDataModel.createNode(nodeName, True)
        oChildNode1.appendChild(oSubChildNode(i))
    Next i

    oTreeControl.Model.DataModel = oMutableTreeDataModel
    oTreeControl.expandNode(oRootNode)
    oView = oTreeControl.getView()
    oView.setFocus()

End Sub

Sub RepopulateTreeView

    oTreeControl.Model.DataModel = Nothing
    WebDAV_PROPFIND
    PopulateTreeView

End Sub

Sub WebDAV_delete(fName As String)

    Dim url As String, ucb As Object, provider As Object, id As Object, content As Object
    url = "https://webdavserver.net/UserXXXXXXX/newfolder/" & fName 'Korvaa UserXXXXXXX omalla

    ucb = CreateUnoService("com.sun.star.ucb.UniversalContentBroker")
    provider = CreateUnoService("com.sun.star.ucb.WebDAVContentProvider")
    id = ucb.createContentIdentifier(url)
    content = provider.queryContent(id)

    Dim args As Object, cmd As Object

    args = CreateUnoStruct("com.sun.star.ucb.OpenCommandArgument2")
    args.Mode = 2 'file
    args.Priority = 0

    cmd = CreateUnoStruct("com.sun.star.ucb.Command")
    cmd.Name = "delete"
    cmd.Handle = -1
    cmd.Argument = args
    content.execute(cmd, 0, Nothing)
    cmd = Nothing
    args = Nothing
    content = Nothing
    provider = Nothing
    id = Nothing
    ucb = Nothing

End Sub

Sub CmdAction

    oChk.Model.State = 0
    oChk2.Model.State = 0

    WebDAV_put
    If Not Aborted Then
        WebDAV_PROPFIND
        RepopulateTreeView
    End If
    Aborted = False

End Sub

Sub Chk1Cahnged(oEvent) 'Sido CheckBox1 -> Objektin tilaa muutettu tapahtumaan
    If oEvent.Source.Model.State = 1 Then
        oChk2.Model.State = 0
    End If
End Sub

Sub Chk2Cahnged(oEvent)  'Sido CheckBox2 -> Objektin tilaa muutettu tapahtumaan
    If oEvent.Source.Model.State = 1 Then
        oChk.Model.State = 0
    End If
End Sub

Sub GetSelection(oEvent)

    Dim sel As Variant
    On Error Resume Next
    sel = oEvent.Source.getSelection()

    If Err <> 0 Then
        MsgBox Err.Description
        Reset
    Else
        If Not IsNull(sel) Then
            If InStr(sel.getDisplayValue, "webdavserver.net") = 0 And InStr(sel.getDisplayValue, ".") > 0 Then
                Select Case oChk2.Model.State
                    Case 1
                        WebDav_delete sel.getDisplayValue()
                        WebDAV_PROPFIND
                        RepopulateTreeView
                        Exit Sub
                    Case Else
                End Select

                Select Case oChk.Model.State
                    Case 0
                        OpenRemoteFile sel.getDisplayValue()
                    Case 1
                        WebDAV_get sel.getDisplayValue()
                    Case Else
                End Select
            End If
        End If
    End If

End Sub

Sub TreeMouseUp(oEvent) 'Sido TreeControl1 -> Näppäin vapautettu tapahtumaan
    GetSelection oEvent
End Sub

Sub TreeKeyUp(oEvent) 'Sido TreeControl1 -> Hiiren painike vapautettu tapahtumaan
    GetSelection oEvent
End Sub

Function InStrReverse(sText As String, search As String) As Long

    If sText = "" Or search = "" Or Len(search) > Len(sText) Then
        InStrReverse = 0
    	Exit Function
    End If

    Dim i As Long

    For i = Len(sText) To 1 Step -1
        If Mid(sText, i, Len(search)) = search Then
            InStrReverse = i : Exit Function
        End If
    Next i

End Function

Voit automatisoida systeemiä seuraavasti: Valitse LibreOfficen valikkoriviltä Työkalut -> Mukauta ja avaa Tapahtumat välilehti. Sido Avaa asiakirja tapahtuma -> ShowDialog aliohjelmaan ja Näkymää ollaan sulkemassa tapahtuma TopListen_WindowClosing aliohjelmaan. Voi olla myös hyvä idea laittaa valikkoriville oma valinta-täppä. Työkalut -> Mukauta ja avaa Valikot välilehti. Valitse vasemmalta Rajaus alasvetovalikosta se nimi jolla tallensit projektisi. Valitse sitten Kohde laatikon vasemmalla puolella oleva pienempi täppä (kolme viivaa päällekkäin). Valitse Lisää ja anna nimeksi vaikka Valintaikkuna. Sen jälkeen avaa Luokka alasvetolaatikko (oikealla ylhällä) ja valitse Makrot. Etsi oma projektisi ja ShowDialog aliohjelma. Siirrä se tuplaklikkaamalla oikenapuoleiseen laatikkoon. Voit nyt nimetä sen uudelleen valitsemalla Muuta (alhalla) ja nimeämällä esim. Avaa. Klikkaa sitten OK ja tallenna projektisi.

HV (hauskaa vappua jo etukäteen)

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta