A new version of Files was added to project The Inbox:
http://source.squeak.org/inbox/Files-ul.141.mcz ==================== Summary ==================== Name: Files-ul.141 Author: ul Time: 27 October 2014, 4:51:14.305 pm UUID: b0dbabfe-ce75-4f18-a82f-2f95fa8b026e Ancestors: Files-eem.138 - use the new ExternalObjectTable API =============== Diff against Files-eem.138 =============== Item was changed: ----- Method: AsyncFile>>open:forWrite: (in category 'as yet unclassified') ----- open: fullFileName forWrite: aBoolean "Open a file of the given name, and return a handle for that file. Answer the receiver if the primitive succeeds, nil otherwise. If openForWrite is true, then: if there is no existing file with this name, then create one else open the existing file in read-write mode otherwise: if there is an existing file with this name, then open it read-only else answer nil." "Note: if an exisiting file is opened for writing, it is NOT truncated. If truncation is desired, the file should be deleted before being opened as an asynchronous file." "Note: On some platforms (e.g., Mac), a file can only have one writer at a time." - | semaIndex | name := fullFileName. writeable := aBoolean. + ^Smalltalk newExternalSemaphoreDo: [ :newSemaphore :index | + fileHandle := self primOpen: name asVmPathName forWrite: writeable semaIndex: index. + fileHandle + ifNotNil: [ + semaphore := newSemaphore. + self ] + ifNil: [ + Smalltalk unregisterExternalObject: newSemaphore. + nil ] ]! - semaphore := Semaphore new. - semaIndex := Smalltalk registerExternalObject: semaphore. - fileHandle := self primOpen: name asVmPathName forWrite: writeable semaIndex: semaIndex. - fileHandle ifNil: [ - Smalltalk unregisterExternalObject: semaphore. - semaphore := nil. - ^ nil]. - ! Item was changed: ----- Method: StandardFileStream>>post:target:url:ifError: (in category 'browser requests') ----- post: data target: target url: url ifError: errorBlock "Post data to the given URL. The returned file stream contains the reply of the server. If Squeak is not running in a browser evaluate errorBlock" + - | sema index request result | self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value]. + Smalltalk newExternalSemaphoreDo: [ :semaphore :index | + | request result | + request := self primURLPost: url target: target data: data semaIndex: index. + request ifNil: [ + Smalltalk unregisterExternalObject: semaphore. + ^errorBlock value ]. + [ semaphore wait. "until something happens" + result := self primURLRequestState: request. + result == nil ] whileTrue. + result ifTrue: [ fileID := self primURLRequestFileHandle: request ]. - sema := Semaphore new. - index := Smalltalk registerExternalObject: sema. - request := self primURLPost: url target: target data: data semaIndex: index. - request == nil ifTrue:[ - - Smalltalk unregisterExternalObject: sema. - ^errorBlock value. - ] ifFalse:[ - [sema wait. "until something happens" - result := self primURLRequestState: request. - result == nil] whileTrue. - result ifTrue:[fileID := self primURLRequestFileHandle: request]. self primURLRequestDestroy: request. + Smalltalk unregisterExternalObject: semaphore ]. + fileID ifNil: [ ^nil ]. - ]. - Smalltalk unregisterExternalObject: sema. - fileID == nil ifTrue:[^nil]. self register. name := url. rwmode := false. buffer1 := String new: 1. + self enableReadBuffering! - self enableReadBuffering - ! Item was changed: ----- Method: StandardFileStream>>requestURL:target:ifError: (in category 'browser requests') ----- requestURL: url target: target ifError: errorBlock "Request to go to the target for the given URL. If Squeak is not running in a browser evaluate errorBlock" - | sema index request result | self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value]. + Smalltalk newExternalSemaphoreDo: [ :semaphore :index | + | request result | + request := self primURLRequest: url target: target semaIndex: index. + request ifNil: [ + Smalltalk unregisterExternalObject: semaphore. + ^errorBlock value ]. + [ semaphore wait. "until something happens" + result := self primURLRequestState: request. + result == nil ] whileTrue. - sema := Semaphore new. - index := Smalltalk registerExternalObject: sema. - request := self primURLRequest: url target: target semaIndex: index. - request == nil ifTrue:[ - - Smalltalk unregisterExternalObject: sema. - ^errorBlock value. - ] ifFalse:[ - [sema wait. "until something happens" - result := self primURLRequestState: request. - result == nil] whileTrue. self primURLRequestDestroy: request. + Smalltalk unregisterExternalObject: semaphore ]. + fileID ifNil: [ ^nil ]. - ]. - Smalltalk unregisterExternalObject: sema. - fileID == nil ifTrue:[^nil]. self register. name := url. rwmode := false. buffer1 := String new: 1. + self enableReadBuffering! - self enableReadBuffering - ! Item was changed: ----- Method: StandardFileStream>>requestURLStream:ifError: (in category 'browser requests') ----- requestURLStream: url ifError: errorBlock "Request a FileStream for the given URL. If Squeak is not running in a browser evaluate errorBlock" "FileStream requestURLStream:'http://www.squeak.org'" + - | sema index request result | self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value]. + Smalltalk newExternalSemaphoreDo: [ :semaphore :index | + | request result | + request := self primURLRequest: url semaIndex: index. + request ifNil: [ + Smalltalk unregisterExternalObject: semaphore. + ^errorBlock value ]. + [ semaphore wait. "until something happens" + result := self primURLRequestState: request. + result == nil ] whileTrue. + result ifTrue: [ fileID := self primURLRequestFileHandle: request ]. - sema := Semaphore new. - index := Smalltalk registerExternalObject: sema. - request := self primURLRequest: url semaIndex: index. - request == nil ifTrue:[ - - Smalltalk unregisterExternalObject: sema. - ^errorBlock value. - ] ifFalse:[ - [sema wait. "until something happens" - result := self primURLRequestState: request. - result == nil] whileTrue. - result ifTrue:[fileID := self primURLRequestFileHandle: request]. self primURLRequestDestroy: request. + Smalltalk unregisterExternalObject: semaphore ]. + fileID ifNil: [ ^nil ]. - ]. - Smalltalk unregisterExternalObject: sema. - fileID == nil ifTrue:[^nil]. self register. name := url. rwmode := false. buffer1 := String new: 1. + self enableReadBuffering! - self enableReadBuffering - ! |
Free forum by Nabble | Edit this page |