SftpURI.st
author Stefan Vogel <sv@exept.de>
Wed, 14 Mar 2012 17:31:21 +0100
changeset 2732 ce767436e959
parent 2483 da3897369cd3
child 2873 4526baf35dd2
permissions -rw-r--r--
Pcsmd 2.7 0011-pcsmd-isReachable.chg Fix SFTP when filenames contain trailing spaces Fix PG isReachable if url is nil (default url has not been saved) Fix operation restart if there is no reachable PG
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     1
"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2009 by eXept Software AG
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     4
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
 hereby transferred.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
HierarchicalURI subclass:#SftpURI
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:''
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
	classVariableNames:''
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
	category:'Net-Resources'
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
Object subclass:#WriteStreamSimulator
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
	instanceVariableNames:'connection remotePath'
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
	classVariableNames:''
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
	poolDictionaries:''
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    25
	privateIn:SftpURI
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    26
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    27
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
!SftpURI class methodsFor:'documentation'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    29
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    30
copyright
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
 COPYRIGHT (c) 2009 by eXept Software AG
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
              All Rights Reserved
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    34
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    35
 This software is furnished under a license and may be used
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    36
 only in accordance with the terms of that license and with the
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    37
 inclusion of the above copyright notice.   This software may not
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    38
 be provided or otherwise made available to, or used by, any
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    39
 other person.  No title to or ownership of the software is
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    40
 hereby transferred.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    41
"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    42
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    43
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    44
!SftpURI class methodsFor:'accessing'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    45
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    46
schemes
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    47
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    48
    ^ #(sftp)
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    49
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    51
!SftpURI class methodsFor:'ftp requests'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    52
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    53
pathExists:aPathname ftpClient:aFtpClient
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    54
    |list|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
    (OpenError, FTPClient fileNotFoundErrorSignal) handle:[:ex|] do:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
        list := aFtpClient directoryContentsOf:aPathname.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
        ^ list size = 1 and:[list first = aPathname].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
    ^ false.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    62
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    63
!SftpURI methodsFor:'defaults'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    64
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    65
defaultPort
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    66
    "answer the default ssh port here"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    67
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    68
    ^ 22
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    69
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    70
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    71
defaultUser
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    72
    ^ OperatingSystem getLoginName
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    75
!SftpURI methodsFor:'ftp requests'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
connectThenDo:aOneArgBlock
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
    "setup a ftp connection and call aOneArgBlock with it"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
    |sftpClient|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    81
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
    sftpClient := Smalltalk::SftpClient new
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
                hostname:self host;
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
                username:self user;
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
                port:self port.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
    aOneArgBlock value:sftpClient.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
!SftpURI methodsFor:'stream access'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
readStreamDo:aBlock
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    93
    self connectThenDo:[:ftp| |stream path attributes|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
        [
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    95
            path := self path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    96
            attributes := self class attributes.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
            attributes at:#fileSize put:(ftp sizeOf:path).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
            attributes at:#baseName put:self pathSegments last.  
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
            attributes at:#uriInfo  put:self printString.  
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   100
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   101
            stream := ftp getStreamFor:path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   102
            aBlock value:stream value:attributes.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   103
        ] ensure:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   104
            stream notNil ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   105
                stream close.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   106
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   107
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   108
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   109
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   110
    "
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   111
     'ftp://stefan:password@ftp.exept.de/etc/group' asURI readStreamDo:[:stream :attributes | 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   112
         self halt
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   113
      ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   114
    "
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   115
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   116
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   117
readStreamsDo:aBlock
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
    "evaluate the block with a Collection of streams as first argument
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   119
     and a dictionary containing attributes as second argument,
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   120
     - a collection with a stream on a single file,
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   121
     - or a collection with streams on a directory's files, but not recursive
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   122
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   123
     The streams are closed after aBlock has been evaluated.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   124
     Attributes may be the mime type (key #MIME)"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   125
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   126
    self readStreamsDo:aBlock skipFilenamesWithSuffix:nil renameBlock:nil
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   127
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   128
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   129
readStreamsDo:aBlock filterBlock:oneArgFilterBlock renameBlock:renameBlock
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   130
    "evaluate the block with a Collection of streams as first argument
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   131
     and a dictionary containing attributes as second argument,
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   132
     - a collection with a stream on a single file,
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   133
     - or a collection with streams on a directory's files, but not recursive
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   134
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   135
     The streams are closed after aBlock has been evaluated.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   136
     Attributes may be the mime type (key #MIME)"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   137
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   138
    |attributes list requestDirectory path dirUri dirPath|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   139
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   140
    requestDirectory := false.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   141
    path := self path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   142
    "kludge for pathnames starting with a users home dirctory"
2483
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   143
    (path startsWith:'/~/') ifTrue:[
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   144
        path := path copyFrom:4.
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   145
    ].
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   146
    (path startsWith:'/~') ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   147
        path := path copyFrom:2.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   148
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   149
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   150
    attributes := self class attributes.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   151
    list := OrderedCollection new.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   152
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   153
    self connectThenDo:[:ftp| 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   154
        |baseName|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   155
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   156
        "try to change directory to path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   157
         If we get a file error, we know that the directory does not exist"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   158
        baseName := self baseName.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   159
        (baseName includesAny:'*?[]') ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   160
            requestDirectory := true.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   161
            dirUri  := self directory.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   162
            dirPath := dirUri path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   163
            "kludge for pathnames starting with a users home dirctory"
2483
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   164
            (dirPath startsWith:'/~/') ifTrue:[
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   165
                dirPath := dirPath copyFrom:4.
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   166
            ].
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   167
            (dirPath startsWith:'/~') ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   168
                dirPath := dirPath copyFrom:2.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   169
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   170
            FTPClient fileNotFoundErrorSignal handle:[:ex|] 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   171
                "skip error about an empty directory"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   172
            do:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   173
                list addAll:
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   174
                    ((ftp directoryContentsOf:dirPath) 
2732
ce767436e959 Pcsmd 2.7 0011-pcsmd-isReachable.chg
Stefan Vogel <sv@exept.de>
parents: 2483
diff changeset
   175
                        collect:[:filenameString| filenameString withoutSeparators asFilename baseName]
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   176
                        thenSelect:[:filenameString| filenameString matches:baseName]).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   177
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   178
        ] ifFalse:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   179
            [
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   180
                dirUri := self.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   181
                dirPath := path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   182
                requestDirectory := true.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   183
                FTPClient fileNotFoundErrorSignal handle:[:ex|] 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   184
                    "skip error about an empty directory"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   185
                do:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   186
                    list addAll:
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   187
                        ((ftp directoryContentsOf:dirPath) 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   188
                            collect:[:filenameString| filenameString asFilename baseName]
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   189
                            "thenSelect:[:filenameString| filenameString matches:baseName]").
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   190
                ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   191
            ] on:FTPClient fileErrorSignal do:[:ex|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   192
                "no directory, fetch path istSelf"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   193
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   194
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   195
        requestDirectory ifFalse:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   196
            dirUri := self directory.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   197
            dirPath := dirUri path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   198
            "kludge for pathnames starting with a users home directory"
2483
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   199
            (dirPath startsWith:'/~/') ifTrue:[
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   200
                dirPath := dirPath copyFrom:4.
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   201
            ].
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   202
            (dirPath startsWith:'/~') ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   203
                dirPath := dirPath copyFrom:2.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   204
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   205
            list add:self baseName.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   206
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   207
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   208
        attributes at:#requestDirectory put:requestDirectory.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   209
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   210
        "skip all files which are not selected by filterBlock"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   211
        oneArgFilterBlock notNil ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   212
            list := list select:oneArgFilterBlock.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   213
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   214
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   215
        list do:[:eachBaseName| |stream|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   216
            "get a stream for the contents of the file"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   217
            (OpenError, FTPClient fileErrorSignal) handle:[:ex| 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   218
                "ignore errors -- skip subdirectories"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   219
            ] do:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   220
                stream := ftp getStreamFor:(dirPath, '/', eachBaseName).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   221
"/                attributes at:#fileSize put:(ftp sizeOf:eachBaseName).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   222
                attributes at:#fileSize put:stream fileSize.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   223
                attributes at:#baseName put:eachBaseName.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   224
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   225
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   226
            stream notNil ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   227
                |srcUri srcPath|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   228
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   229
                requestDirectory ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   230
                    "accessing the contents of a directory"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   231
                    srcUri := dirUri construct:eachBaseName.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   232
                ] ifFalse:[ |pathSegments|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   233
                    "accessing a single file"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   234
                    srcUri := self.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   235
                ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   236
                attributes at:#uriInfo put:srcUri.  
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   237
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   238
                [ 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   239
                    aBlock value:stream value:attributes 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   240
                ] ensure:[stream close].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   241
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   242
                renameBlock notNil ifTrue:[ 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   243
                    |renameFilenameString|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   244
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   245
                    renameFilenameString := renameBlock value:eachBaseName.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   246
"/                    [
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   247
                        ftp rename:(dirPath, '/', eachBaseName) to:(dirPath, '/', renameFilenameString).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   248
"/                    ] on:FTPClient fileErrorSignal do:[:ex|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   249
"/                        "rename failed, maybe file already exists"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   250
"/                        renameFilenameString := renameFilenameString, '.', 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   251
"/                            (Timestamp now printStringFormat:'%(year)%(mon)%(day)%h%m%s').
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   252
"/                        ftp rename:eachBaseName to:renameFilenameString.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   253
"/                    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   254
                ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   255
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   256
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   257
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   258
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   259
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   260
    "
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   261
        |pwd|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   262
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   263
        pwd := Dialog requestPassword:''. 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   264
        (URI fromString:('ftp://tm:%1@exept/~/tmp' bindWith:pwd) ) 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   265
            readStreamsDo:[:stream :attributes | 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   266
                Transcript showCR:(attributes at:#baseName).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   267
                Transcript showCR:(attributes at:#fileSize).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   268
                Transcript showCR:(attributes at:#requestDirectory).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   269
                Transcript showCR:(attributes at:#uriInfo).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   270
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   271
    "
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   272
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   273
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   274
readStreamsDo:aBlock renameBlock:renameBlock
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   275
    "evaluate the block with a Collection of streams as first argument
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   276
     and a dictionary containing attributes as second argument,
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   277
     - a collection with a stream on a single file,
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   278
     - or a collection with streams on a directorie's files, but not recursive
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   279
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   280
     The streams are closed after aBlock has been evaluated.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   281
     Attributes may be the mime type (key #MIME)"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   282
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   283
    self readStreamsDo:aBlock skipFilenamesWithSuffix:nil renameBlock:renameBlock
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   284
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   285
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   286
writeStreamDo:aBlock
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   287
    "use FTPClient for now"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   288
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   289
    self connectThenDo:[:ftp| |stream|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   290
        [
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   291
            stream := ftp putStreamFor:self path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   292
            aBlock value:stream value:self class attributes.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   293
        ] ensure:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   294
            stream notNil ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   295
                stream close.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   296
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   297
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   298
    ]
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   299
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   300
    "
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   301
     'ftp://stefan:password@hippo/etc/group' asURI writeStreamDo:[:stream :attributes | 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   302
         self halt
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   303
      ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   304
    "
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   305
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   306
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   307
writeStreamDo:aBlock create:doCreate
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   308
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   309
    ^ self writeStreamDo:aBlock create:doCreate atomic:false.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   310
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   311
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   312
writeStreamDo:aBlock create:doCreate atomic:doAtomic
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   313
    "use FTPClient for now.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   314
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   315
     If doCreate is true, a nonExistent directory will be created.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   316
     If doAtomic is true, files will appear atomically, by using
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   317
        an intermediate file theat will be renamed"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   318
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   319
    |path toPath directory|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   320
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   321
    path := self path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   322
    "kludge"
2483
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   323
    (path startsWith:'/~/') ifTrue:[
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   324
        path := path copyFrom:4.
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   325
    ].
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   326
    (path startsWith:'/~') ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   327
        path := path copyFrom:2.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   328
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   329
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   330
    doAtomic ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   331
        toPath := self directoryPath, '/.transferFile'.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   332
        "kludge"
2483
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   333
        (toPath startsWith:'/~/') ifTrue:[
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   334
            toPath := toPath copyFrom:4.
da3897369cd3 Fixes for SFTP/Solaris and '~' paths
Stefan Vogel <sv@exept.de>
parents: 2473
diff changeset
   335
        ].
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   336
        (toPath startsWith:'/~') ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   337
            toPath := toPath copyFrom:2.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   338
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   339
    ] ifFalse:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   340
        toPath := path.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   341
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   342
        
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   343
    self connectThenDo:[:ftp| |stream|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   344
        [
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   345
            [
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   346
                (self class pathExists:path ftpClient:ftp) ifTrue:[ |infoStream|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   347
                    infoStream := '' writeStream.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   348
                    self publicPrintOn:infoStream.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   349
                    self error:('FTP write: Datei %1 already exists!!' bindWith:infoStream contents).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   350
                ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   351
"/                stream := ftp putStreamFor:toPath.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   352
                stream := WriteStreamSimulator new 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   353
                                        remotePath:toPath;
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   354
                                        connection:ftp.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   355
                aBlock value:stream value:self class attributes.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   356
            ] on:OpenError, FTPClient filePutErrorSignal do:[:ex|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   357
                doCreate ifFalse:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   358
                    ex reject
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   359
                ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   360
                "create the missing directory on the fly"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   361
                directory := self directoryPath.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   362
                FTPClient fileNotFoundErrorSignal handle:[:ex| ] do:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   363
                    ftp mkdir:directory.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   364
                ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   365
"/                ftp cd:directory.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   366
                (self class pathExists:path ftpClient:ftp) ifTrue:[ |infoStream|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   367
                    infoStream := '' writeStream.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   368
                    self publicPrintOn:infoStream.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   369
                    self error:('FTP write: Datei %1 already exists!!' bindWith:infoStream contents).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   370
                ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   371
"/                stream := ftp putStreamFor:toPath.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   372
                aBlock value:stream value:self class attributes.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   373
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   374
            stream close.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   375
            doAtomic ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   376
                ftp rename:toPath to:path
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   377
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   378
        ] ifCurtailed:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   379
            stream notNil ifTrue:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   380
                stream close.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   381
            ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   382
        ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   383
    ]
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   384
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   385
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   386
!SftpURI methodsFor:'testing'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   387
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   388
exists
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   389
    "does the file represented by this uri exist?
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   390
     establish a connection for try to get a readStream"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   391
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   392
    |exists|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   393
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   394
    self connectThenDo:[:aFtpClient|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   395
        exists :=  self class pathExists:self path ftpClient:aFtpClient
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   396
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   397
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   398
    ^ exists ? false
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   399
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   400
"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   401
    |pwd uri|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   402
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   403
    pwd := Dialog requestPassword:'Password:'. 
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   404
    uri := (URI fromString:('ftp://tm:%1@exept/home/tm/tmp/test.txt' bindWith:pwd) ).
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   405
    uri pathExists
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   406
"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   407
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   408
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   409
isAbsolute
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   410
    "there is nothing like a relative ftp URI"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   411
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   412
    ^ true
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   413
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   414
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   415
isRemote
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   416
    "return true, if this is a remote URI"
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   417
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   418
    ^ true
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   419
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   420
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   421
!SftpURI::WriteStreamSimulator methodsFor:'accessing'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   422
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   423
connection
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   424
    ^ connection
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   425
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   426
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   427
connection:something
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   428
    connection := something.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   429
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   430
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   431
remotePath
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   432
    ^ remotePath
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   433
!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   434
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   435
remotePath:something
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   436
    remotePath := something.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   437
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   438
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   439
!SftpURI::WriteStreamSimulator methodsFor:'copying'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   440
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   441
copyToEndFrom:readStream
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   442
    |localPathName|
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   443
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   444
    readStream isFileStream ifFalse:[
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   445
        self error:'WriteStreamSimulator - source is not a FileStream'.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   446
    ].
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   447
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   448
    localPathName := readStream pathName.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   449
    connection copyLocal:localPathName to:remotePath.
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   450
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   451
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   452
!SftpURI::WriteStreamSimulator methodsFor:'queries'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   453
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   454
isWritable
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   455
    ^ remotePath notNil
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   456
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   457
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   458
!SftpURI::WriteStreamSimulator methodsFor:'stream simulation'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   459
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   460
close
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   461
   ^ self
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   462
! !
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   463
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   464
!SftpURI class methodsFor:'documentation'!
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   465
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   466
version_CVS
2732
ce767436e959 Pcsmd 2.7 0011-pcsmd-isReachable.chg
Stefan Vogel <sv@exept.de>
parents: 2483
diff changeset
   467
    ^ '$Header: /cvs/stx/stx/libbasic2/SftpURI.st,v 1.3 2012-03-14 16:31:21 stefan Exp $'
2473
774f49f32841 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   468
! !