'From Squeak3.4beta of ''1 December 2002'' [latest update: #5156] on 20 December 2002 at 3:50:11 pm'! "Change Set: ProjectArchiveFixes-nk Date: 20 December 2002 Author: Ned Konz My recent changes to fileName in ArchiveMember broke project loading in non-Unix systems. This reverts fileName so that it returns the raw Zip name, and adds localFileName for use when you need a name that's compatible with the local file system. "! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 14:57'! addDirectory: aFileName as: anotherFileName | newMember | newMember _ self memberClass newFromDirectory: aFileName. self addMember: newMember. newMember localFileName: anotherFileName. ^newMember! ! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 15:03'! addFile: aFileName as: anotherFileName | newMember | newMember _ self memberClass newFromFile: aFileName. self addMember: newMember. newMember localFileName: anotherFileName. ^newMember! ! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 15:03'! addString: aString as: aFileName | newMember | newMember _ self memberClass newFromString: aString named: aFileName. self addMember: newMember. newMember localFileName: aFileName. ^newMember! ! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 15:03'! addTree: aFileNameOrDirectory removingFirstCharacters: n | dir newMember fullPath relativePath | dir _ (aFileNameOrDirectory isString) ifTrue: [ FileDirectory on: aFileNameOrDirectory ] ifFalse: [ aFileNameOrDirectory ]. fullPath _ dir fullNameFor: ''. "this could be a bug..." relativePath _ fullPath copyFrom: n + 1 to: fullPath size. dir entries do: [ :ea | | fullName | fullName _ fullPath, ea name. newMember _ ea isDirectory ifTrue: [ self memberClass newFromDirectory: fullName ] ifFalse: [ self memberClass newFromFile: fullName ]. newMember localFileName: relativePath, ea name. self addMember: newMember. ea isDirectory ifTrue: [ self addTree: fullName removingFirstCharacters: n ]. ]. ! ! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 14:48'! extractMember: aMemberOrName | member | member _ self member: aMemberOrName. member ifNil: [ ^nil ]. member extractToFileNamed: member localFileName inDirectory: FileDirectory default.! ! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 14:48'! extractMemberWithoutPath: aMemberOrName inDirectory: dir | member | member _ self member: aMemberOrName. member ifNil: [ ^nil ]. member extractToFileNamed: (FileDirectory localNameFor: member localFileName) inDirectory: dir! ! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 14:50'! memberNamed: aString "Return the first member whose zip name or local file name matches aString, or nil" ^members detect: [ :ea | ea fileName = aString or: [ ea localFileName = aString ]] ifNone: [ ]! ! !Archive methodsFor: 'archive operations' stamp: 'nk 12/20/2002 14:50'! membersMatching: aString ^members select: [ :ea | (aString match: ea fileName) or: [ aString match: ea localFileName ] ]! ! !ArchiveMember methodsFor: 'accessing' stamp: 'nk 12/20/2002 15:02'! localFileName: aString "Set my internal filename. Returns the (possibly new) filename. aString will be translated from local FS format into Unix format." ^fileName _ aString copyReplaceAll: FileDirectory slash with: '/'.! ! !ArchiveMember methodsFor: 'printing' stamp: 'nk 12/20/2002 15:11'! printOn: aStream super printOn: aStream. aStream nextPut: $(; nextPutAll: self fileName; nextPut: $)! ! !ArchiveViewer methodsFor: 'archive operations' stamp: 'nk 12/20/2002 14:51'! extractAllPossibleInDirectory: directory "Answer true if I can extract all the files in the given directory safely. Inform the user as to problems." | conflicts | self canExtractAll ifFalse: [ ^false ]. conflicts _ Set new. self members do: [ :ea | | fullName | fullName _ directory fullNameFor: ea localFileName. (ea usesFileNamed: fullName) ifTrue: [ conflicts add: fullName ]. ]. conflicts notEmpty ifTrue: [ | str | str _ WriteStream on: (String new: 200). str nextPutAll: 'The following file(s) are needed by archive members and cannot be overwritten:'; cr. conflicts do: [ :ea | str nextPutAll: ea ] separatedBy: [ str cr ]. self inform: str contents. ^false. ]. conflicts _ Set new. self members do: [ :ea | | fullName | fullName _ directory relativeNameFor: ea localFileName. (directory fileExists: fullName) ifTrue: [ conflicts add: fullName ]. ]. conflicts notEmpty ifTrue: [ | str | str _ WriteStream on: (String new: 200). str nextPutAll: 'The following file(s) will be overwritten:'; cr. conflicts do: [ :ea | str nextPutAll: ea ] separatedBy: [ str cr ]. str cr; nextPutAll: 'Is this OK?'. ^PopUpMenu confirm: str contents. ]. ^true. ! ! !ZipArchiveMember methodsFor: 'accessing' stamp: 'nk 12/20/2002 14:49'! extractInDirectory: dir self extractToFileNamed: self localFileName inDirectory: dir ! ! !ZipArchiveMember methodsFor: 'accessing' stamp: 'nk 12/20/2002 14:48'! extractToFileNamed: aLocalFileName inDirectory: dir | stream fullName fullDir | self isEncrypted ifTrue: [ ^self error: 'encryption unsupported' ]. fullName _ dir relativeNameFor: aLocalFileName. fullDir _ FileDirectory forFileName: fullName. fullDir assureExistence. self isDirectory ifFalse: [ stream _ fullDir forceNewFileNamed: (FileDirectory localNameFor: fullName). self extractTo: stream. stream close. ] ifTrue: [ fullDir assureExistence ] ! ! !ZipArchiveMember methodsFor: 'accessing' stamp: 'nk 12/20/2002 14:44'! localFileName "Answer my fileName in terms of the local directory naming convention" ^fileName copyReplaceAll: '/' with: FileDirectory slash ! ! !ZipDirectoryMember methodsFor: 'accessing' stamp: 'nk 12/20/2002 14:45'! localFileName: aString | dir entry parent | super localFileName: aString. fileName last = $/ ifFalse: [ fileName _ fileName, '/' ]. parent _ FileDirectory default. (parent directoryExists: fileName) ifTrue: [ dir _ FileDirectory on: (parent fullNameFor: fileName). entry _ dir directoryEntry. self setLastModFileDateTimeFrom: entry modificationTime ] ! ! !ZipDirectoryMember class methodsFor: 'as yet unclassified' stamp: 'nk 12/20/2002 14:57'! newNamed: aFileName ^(self new) localFileName: aFileName; yourself! ! !ZipNewFileMember methodsFor: 'initialization' stamp: 'nk 12/20/2002 15:01'! from: aFileName | entry | compressionMethod _ CompressionStored. "Now get the size, attributes, and timestamps, and see if the file exists" stream _ StandardFileStream readOnlyFileNamed: aFileName. self localFileName: (externalFileName _ stream name). entry _ stream directoryEntry. compressedSize _ uncompressedSize _ entry fileSize. desiredCompressionMethod _ compressedSize > 0 ifTrue: [ CompressionDeflated ] ifFalse: [ CompressionStored ]. self setLastModFileDateTimeFrom: entry modificationTime ! ! !ZipStringMember class methodsFor: 'as yet unclassified' stamp: 'nk 12/20/2002 15:06'! newFrom: aString named: aFileName ^(self new) contents: aString; localFileName: aFileName; yourself! ! ZipDirectoryMember removeSelector: #fileName:! ZipArchiveMember removeSelector: #fileName! ZipArchiveMember removeSelector: #fileName:! ZipArchiveMember removeSelector: #localFileName:! ZipArchiveMember removeSelector: #rawFileName! ArchiveMember removeSelector: #rawFileName:!