FileURI.st
author Claus Gittinger <cg@exept.de>
Fri, 29 Aug 2003 21:33:49 +0200
changeset 1310 948ed141b0b7
parent 1309 c752d54f4e09
child 1374 85c524889e47
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1309
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     1
"
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     2
 COPYRIGHT (c) 2002 by eXept Software AG
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     3
              All Rights Reserved
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     4
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     5
 This software is furnished under a license and may be used
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     6
 only in accordance with the terms of that license and with the
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     8
 be provided or otherwise made available to, or used by, any
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
     9
 other person.  No title to or ownership of the software is
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    10
 hereby transferred.
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    11
"
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    12
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
"{ Package: 'stx:libbasic2' }"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
HierarchicalURI subclass:#FileURI
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
	instanceVariableNames:''
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
	classVariableNames:''
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
	poolDictionaries:''
1310
948ed141b0b7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1309
diff changeset
    19
	category:'Net-Resources'
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
1309
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    22
!FileURI class methodsFor:'documentation'!
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    23
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    24
copyright
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    25
"
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    26
 COPYRIGHT (c) 2002 by eXept Software AG
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    27
              All Rights Reserved
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    28
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    29
 This software is furnished under a license and may be used
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    30
 only in accordance with the terms of that license and with the
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    31
 inclusion of the above copyright notice.   This software may not
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    32
 be provided or otherwise made available to, or used by, any
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    33
 other person.  No title to or ownership of the software is
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    34
 hereby transferred.
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    35
"
c752d54f4e09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1284
diff changeset
    36
! !
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    37
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    38
!FileURI class methodsFor:'instance creation'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    39
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    40
fromFilename:aFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    41
    "create an URI based on an a filename"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    42
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    43
    ^ self new fromFilename:aFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    44
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    45
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    46
!FileURI class methodsFor:'accessing'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    47
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    48
schemes
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    49
    "answer the list of supported schemes"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    51
    ^ #(file)
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    52
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    53
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    54
!FileURI methodsFor:'converting'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
asFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
    "answer the receiver represented as filename"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
    ^ authority notNil ifTrue:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
        Filename remoteHost:authority rootComponents:pathSegments.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
    ] ifFalse:[
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    62
        "kludge"
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    63
        (pathSegments first startsWith:$~) ifTrue:[
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    64
            pathSegments first asFilename construct:(Filename rootComponents:(pathSegments copyFrom:2)).
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    65
        ] ifFalse:[
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    66
            Filename rootComponents:pathSegments.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    67
        ].
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    68
    ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    69
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    70
    "
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    71
        (URI fromString:'file:~/bla') asFilename
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    72
        (URI fromString:'file:~root/bla') asFilename 
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
    73
    "
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    75
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
!FileURI methodsFor:'initialize'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
fromFilename:aFilename
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
    "create an URI based on an a filename"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    81
    |components|
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
    components := aFilename components.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
    aFilename isAbsolute ifTrue:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
        (components size > 3 and:[(components at:2) size == 0]) ifTrue:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
            "this is a MS-Windows network path: \\host\path"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
            authority := components at:3.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
            pathSegments := components copyFrom:4.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
        ] ifFalse:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
            "this is an absolute path"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
            isAbsolute := true.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
            pathSegments := components copyFrom:2.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    93
        ].
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
    ] ifFalse:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    95
        "this is a relative path"
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    96
        isAbsolute := false.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
        pathSegments := components.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
    ]
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   100
    "
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   101
      self fromFilename:'/a/b/c'  asFilename   
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   102
      self fromFilename:'//a/b/c' asFilename  
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   103
      self fromFilename:'a/b/c'   asFilename    
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   104
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   105
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   106
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   107
!FileURI methodsFor:'queries'!
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   108
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   109
exists
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   110
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   111
    ^ self asFilename exists
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   112
! !
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   113
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   114
!FileURI methodsFor:'stream access'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   115
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   116
readStream
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   117
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
    ^ self asFilename readStream
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   119
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   120
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   121
     'file:/etc/group' asURI readStream contents
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   122
     'file:/~/.profile' asURI readStream contents
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   123
     (URI fromString:'file:~/.profile') asFilename
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   124
     (URI fromString:'file:~/.profile') readStream upToEnd
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   125
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   126
!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   127
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   128
readStreamDo:aBlock
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   129
    "evaluate a block with the read stream as first argument
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   130
     and a dictionary containing attributes as second argument.
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   131
     The stream is closed after aBlock has been evaluated."
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   132
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   133
    |attributes file stream|
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   134
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   135
    attributes := self class attributes.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   136
    file := self asFilename.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   137
    attributes at:#fileSize put:(file fileSize).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   138
    attributes at:#baseName put:file baseName.  
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   139
    attributes at:#uriInfo  put:self printString.  
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   140
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   141
    ^ [ 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   142
        stream := file readStream.
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   143
        aBlock value:stream value:attributes
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   144
     ] ensure:[
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   145
        stream notNil ifTrue:[stream close]
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   146
     ].
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   147
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   148
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   149
     'file:/etc/group' asURI readStreamDo:[:stream :attributes|
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   150
        stream contents         
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   151
                addFirst:attributes printString; 
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   152
                yourself
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   153
     ].
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   154
    "
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   155
!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   156
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   157
readStreamsDo:aBlock
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   158
    "evaluate the block with a Collection of streams as first argument
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   159
     and a dictionary containing attributes as second argument,
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   160
     - a collection with a stream on a single file,
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   161
     - or a collection with streams on a directorie's files, but not recursive"
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   162
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   163
    self readStreamsDo:aBlock renameBlock:nil.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   164
!
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   165
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   166
readStreamsDo:aBlock renameBlock:renameBlock
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   167
    "evaluate the block with a Collection of streams as first argument
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   168
     and a dictionary containing attributes as second argument,
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   169
     - a collection with a stream on a single file,
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   170
     - or a collection with streams on a directories files, but not recursive"
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   171
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   172
    |attributes fn files list baseName|
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   173
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   174
    fn := self asFilename.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   175
    files := OrderedCollection new.
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   176
    list := OrderedCollection new.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   177
    attributes := self class attributes.
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   178
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   179
    fn isDirectory ifTrue:[
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   180
        attributes at:#requestDirectory put:true.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   181
        fn directoryContentsAsFilenamesDo:[:eachFilename|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   182
            eachFilename isDirectory ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   183
                files add:eachFilename
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   184
            ].
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   185
        ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   186
    ] ifFalse:[
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   187
        baseName := fn baseName.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   188
        (baseName includesAny:'*?[]') ifTrue:[ |directoryName|
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   189
            attributes at:#requestDirectory put:true.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   190
            directoryName := fn directory.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   191
            directoryName directoryContentsDo:[:eachFilenameString|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   192
                (baseName match:eachFilenameString) ifTrue:[ |filename|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   193
                    filename := directoryName construct:eachFilenameString.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   194
                    filename isDirectory ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   195
                        files add:(directoryName construct:eachFilenameString).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   196
                    ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   197
                ].
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   198
            ].
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   199
        ] ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   200
            attributes at:#requestDirectory put:false.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   201
            files add:fn.
1264
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   202
        ].
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   203
    ].
650132956801 allow '*' and '*.' in path
tm
parents: 1258
diff changeset
   204
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   205
    files do:[:eachFilename| |baseName stream|
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   206
        [
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   207
            baseName := eachFilename baseName.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   208
            attributes at:#fileSize put:eachFilename fileSize.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   209
            attributes at:#baseName put:baseName.  
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   210
            (self pathSegments includes:baseName) ifTrue:[
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   211
                attributes at:#uriInfo put:self.  
1266
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   212
            ] ifFalse:[ |uri col|
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   213
                uri := self copy.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   214
                col := self pathSegments copy.
1266
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   215
                col removeLast.
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   216
                col add:baseName.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   217
                uri pathSegments:col.
1266
4522fd38deef *** empty log message ***
tm
parents: 1264
diff changeset
   218
                attributes at:#uriInfo put:uri.  
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   219
            ].
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   220
            stream := eachFilename readStream.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   221
            aBlock value:stream value:attributes.
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   222
        ] ensure:[
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   223
            stream notNil ifTrue:[stream close]
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   224
        ].
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   225
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   226
        renameBlock notNil ifTrue:[ |renameFilenameString|
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   227
            renameFilenameString := renameBlock value:eachFilename pathName.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   228
            renameFilenameString asFilename exists ifTrue:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   229
                renameFilenameString := renameFilenameString, '.', 
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   230
                        (AbsoluteTime now printStringFormat:'%(year)%(mon)%(day)%h%m%s').
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   231
            ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   232
            eachFilename moveTo:renameFilenameString.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   233
        ].
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   234
    ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   235
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   236
    "
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   237
        (URI fromString:'file:~/test/out') 
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   238
            readStreamsDo:[:stream :attributes | 
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   239
                Transcript showCR:(attributes at:#baseName).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   240
                Transcript showCR:(attributes at:#fileSize).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   241
                Transcript showCR:(attributes at:#requestDirectory).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   242
                Transcript showCR:(attributes at:#uriInfo).
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   243
            ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   244
        (URI fromString:'file:~/test/out/*1') 
1254
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   245
            readStreamsDo:[:stream :attributes | 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   246
                Transcript showCR:(attributes at:#baseName).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   247
                Transcript showCR:(attributes at:#fileSize).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   248
                Transcript showCR:(attributes at:#requestDirectory).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   249
                Transcript showCR:(attributes at:#uriInfo).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   250
            ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   251
    "
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   252
!
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   253
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   254
writeStreamDo:aBlock
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   255
    "evaluate a block with the write stream as first argument
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   256
     and a dictionary containing attributes as second argument.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   257
     The stream is closed after aBlock has been evaluated.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   258
     Attributes may be the mime type (key #MIME)"
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   259
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   260
    |stream|
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   261
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   262
    ^ [
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   263
        stream := self asFilename writeStream.
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   264
        aBlock value:stream value:self class attributes
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   265
     ] ensure:[
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   266
        stream notNil ifTrue:[stream close]
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   267
     ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   268
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   269
    "
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   270
        (URI fromString:'file:/home/tm/tmp') 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   271
            readStreamsDo:[:stream :attributes| 
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   272
                Transcript showCR:(attributes at:#MIME).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   273
                Transcript showCR:(stream isWritable).
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   274
            ].
baf01931b9d6 *** empty log message ***
tm
parents: 1005
diff changeset
   275
    "
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   276
!
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   277
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   278
writeStreamDo:aBlock create:doCreate
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   279
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   280
    ^ self writeStreamDo:aBlock create:doCreate atomic:false.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   281
!
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   282
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   283
writeStreamDo:aBlock create:doCreate atomic:doAtomic
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   284
    "evaluate a block with the write stream as first argument
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   285
     and a dictionary containing attributes as second argument.
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   286
     The stream is closed after aBlock has been evaluated.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   287
     Attributes may be the mime type (key #MIME)
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   288
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   289
     If doCreate is true, a nonExistent directory will be created.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   290
     If doAtomic is true, files will appear atomically, by using
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   291
        an intermediate file theat will be renamed"
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   292
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   293
    |stream fileName toFileName|
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   294
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   295
    fileName := self asFilename.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   296
    toFileName := fileName.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   297
    doAtomic ifTrue:[
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   298
        fileName isDirectory ifFalse:[
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   299
            toFileName := fileName directory.
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   300
        ].
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   301
        toFileName := toFileName construct:'.transferFile'.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   302
    ].
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   303
    [
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   304
        Stream streamErrorSignal handle:[:ex|
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   305
            doCreate ifFalse:[
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   306
                ex reject
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   307
            ].    
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   308
            fileName directory recursiveMakeDirectory.
1284
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   309
            self exists ifTrue:[ |infoStream|
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   310
                infoStream := '' writeStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   311
                self publicPrintOn:infoStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   312
                self error:('Local write: Datei %1 already exists!!' bindWith:infoStream contents).
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   313
            ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   314
            stream := toFileName writeStream.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   315
        ] do:[
1284
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   316
            self exists ifTrue:[ |infoStream|
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   317
                infoStream := '' writeStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   318
                self publicPrintOn:infoStream.
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   319
                self error:('Local write: Datei %1 already exists!!' bindWith:infoStream contents).
57550436b55b file exists error handling
tm
parents: 1271
diff changeset
   320
            ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   321
            stream := toFileName writeStream.
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   322
        ].
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   323
        aBlock value:stream value:self class attributes.
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   324
        stream close.
1268
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   325
        doAtomic ifTrue:[
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   326
            toFileName moveTo:fileName.
48b43aebf125 Fix for home directories
Stefan Vogel <sv@exept.de>
parents: 1267
diff changeset
   327
        ]
1271
ca2e206e7c7f Working version: tilde-expansion, patterns
Stefan Vogel <sv@exept.de>
parents: 1268
diff changeset
   328
    ] ifCurtailed:[
1258
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   329
        stream notNil ifTrue:[stream close]
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   330
    ].
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   331
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   332
    "
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   333
        (URI fromString:'file:/home/tm/tmp') 
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   334
            readStreamsDo:[:stream :attributes| 
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   335
                Transcript showCR:(attributes at:#MIME).
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   336
                Transcript showCR:(stream isWritable).
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   337
            ].
a0eda4db4dad fileTransfer
tm
parents: 1254
diff changeset
   338
    "
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   339
! !
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   340
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   341
!FileURI class methodsFor:'documentation'!
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   342
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   343
version
1310
948ed141b0b7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1309
diff changeset
   344
    ^ '$Header: /cvs/stx/stx/libbasic2/FileURI.st,v 1.11 2003-08-29 19:33:48 cg Exp $'
1005
7ed6fa7ccfba initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   345
! !