'From etoys2.1 of 30 August 2007 [latest update: #1601] on 7 September 2007 at 12:40:53 pm'! "Change Set: keepPrj-bf Date: 6 September 2007 Author: Bert Freudenberg Update the current project in journal on close, save copy on keep button press."! !Project methodsFor: 'file in/out' stamp: 'bf 9/6/2007 16:34'! storeOnServerWithNoInteraction "Save to disk as an Export Segment. Then put that file on the server I came from, as a new version. Version is literal piece of file name. Mime encoded and http encoded." | ret | world setProperty: #optimumExtentFromAuthor toValue: world extent. self isCurrentProject ifTrue: ["exit, then do the command" Flaps globalFlapTabsIfAny do: [:each | Flaps removeFlapTab: each keepInList: true]. ret _ self armsLengthCommand: #storeOnServerWithNoInteraction withDescription: 'Publishing' translated. ^ ret ]. [self storeOnServerWithNoInteractionThenQuitInnards: false] on: Error do: [:ex | ^ false]. ^ true. ! ! !Project methodsFor: 'file in/out' stamp: 'bf 9/6/2007 16:33'! storeOnServerWithNoInteractionThenQuit "Save to disk as an Export Segment. Then put that file on the server I came from, as a new version. Version is literal piece of file name. Mime encoded and http encoded. Then Quit" | ret | world setProperty: #optimumExtentFromAuthor toValue: world extent. self isCurrentProject ifTrue: ["exit, then do the command" Flaps globalFlapTabsIfAny do: [:each | Flaps removeFlapTab: each keepInList: true]. ret _ self armsLengthCommand: #storeOnServerWithNoInteractionThenQuit withDescription: 'Publishing' translated. ^ ret ]. [self storeOnServerWithNoInteractionThenQuitInnards: true] on: Error do: [:ex | ^ false]. ^ true. ! ! !Project methodsFor: 'file in/out' stamp: 'bf 9/6/2007 16:34'! storeOnServerWithNoInteractionThenQuitInnards: aBoolean "Save to disk as an Export Segment. Then put that file on the server I came from, as a new version. Version is literal piece of file name. Mime encoded and http encoded." | newName primaryServerDirectory serverVersionPair localDirectory localVersionPair myVersionNumber warning maxNumber priorWorld myDepth | self assureIntegerVersion. "Find out what version" primaryServerDirectory _ self defaultFolderForAutoSaving ifNil: [^self]. localDirectory _ self squeakletDirectory. serverVersionPair _ self class mostRecent: self name onServer: primaryServerDirectory. localVersionPair _ self class mostRecent: self name onServer: localDirectory. maxNumber _ myVersionNumber _ self currentVersionNumber. ProgressNotification signal: '2:versionsDetected'. warning _ ''. myVersionNumber < serverVersionPair second ifTrue: [ warning _ warning,'\There are newer version(s) on the server' translated. maxNumber _ maxNumber max: serverVersionPair second. ]. myVersionNumber < localVersionPair second ifTrue: [ warning _ warning,'\There are newer version(s) in the local directory' translated. maxNumber _ maxNumber max: localVersionPair second. ]. version _ self bumpVersion: maxNumber. "write locally - now zipped automatically" Display isVirtualScreen ifTrue: [ myDepth _ displayDepth. displayDepth _ DisplayScreen actualScreenDepth. ]. newName _ self versionedFileName. lastSavedAtSeconds _ Time totalSeconds. priorWorld _ ActiveWorld. self exportSegmentFileName: newName directory: localDirectory withoutInteraction: true. ActiveWorld _ priorWorld. (localDirectory readOnlyFileNamed: newName) setFileTypeToObject; close. Display isVirtualScreen ifTrue: [ displayDepth _ myDepth. ]. ProgressNotification signal: '4:localSaveComplete'. "3 is deep in export logic" primaryServerDirectory ifNotNil: [ [ primaryServerDirectory writeProject: self inFileNamed: newName asFileName fromDirectory: localDirectory. ] on: ProjectPasswordNotification do: [ :ex | ex resume: '' ]. ]. aBoolean ifTrue: [Smalltalk quitPrimitive]. ProgressNotification signal: '9999 save complete'. ! ! !SugarLauncher methodsFor: 'running' stamp: 'bf 9/6/2007 16:06'! shutDown Project allSubInstancesDo: [:prj | prj removeParameter: #sugarId]. ServerDirectory inImageServers keysAndValuesDo: [:srvrName :srvr | (srvr isKindOf: SugarDatastoreDirectory) ifTrue: [ ServerDirectory removeServerNamed: srvrName ifAbsent: []]]. Current := nil. World windowEventHandler: nil. buddies := Dictionary new. handlers := Dictionary new. process ifNotNil: [ process terminate. process := nil]. pipe ifNotNil: [ pipe close. pipe := nil].! ! !SugarLauncher methodsFor: 'running' stamp: 'bf 9/6/2007 16:06'! startUp self class allInstances do: [:ea | ea shutDown]. Current := self. World windowEventHandler: self. parameters at: 'ACTIVITY_ID' ifPresent: [ :activityId | process := [self runDBusService: 'org.laptop.Activity', activityId] forkAt: Processor userInterruptPriority named: 'Sugar DBus service'. ServerDirectory addServer: (SugarDatastoreDirectory mimetype: 'application/x-squeak-project' extension: '.pr') named: SugarLauncher defaultDatastoreDirName. parameters at: 'OBJECT_ID' ifPresent: [:id | ^self resumeJournalEntry: id]. self makeJournalEntry. ^self welcome: (parameters at: 'URI' ifAbsent: [''])]. parameters at: 'SUGARPIPE' ifPresent: [ :sugarPipe | ^process := [self fetchCommandsFrom: sugarPipe] forkAt: Processor userInterruptPriority named: 'Sugar Pipe handler']. self welcome: '' ! ! !SugarLauncher methodsFor: 'commands' stamp: 'bf 9/7/2007 11:50'! quit Project current projectParameterAt: #sugarAutoSave put: true; storeOnServerWithNoInteractionThenQuit. ! ! !SugarLauncher methodsFor: 'commands' stamp: 'bf 9/7/2007 11:49'! save Project current projectParameterAt: #sugarAutoSave put: false; storeOnServerWithNoInteraction! ! !SugarLauncher methodsFor: 'events' stamp: 'bf 9/6/2007 16:09'! windowEvent: anEvent anEvent type == #windowClose ifTrue: [^self quit]. ! ! !SugarLauncher methodsFor: 'datastore' stamp: 'bf 9/7/2007 12:33'! makeJournalEntryFor: aProject filename: aFilename mimetype: mimetypeString | id | (id := aProject projectParameterAt: #sugarId) ifNil: [ id := self createJournalEntryFor: aProject filename: aFilename mimetype: mimetypeString. aProject projectParameterAt: #sugarId put: id] ifNotNil: [ (aProject projectParameterAt: #sugarAutoSave ifAbsent: [false]) ifTrue: [self updateJournalEntry: id for: aProject filename: aFilename mimetype: mimetypeString] ifFalse: [self createJournalEntryFor: aProject filename: aFilename mimetype: mimetypeString]]! ! !SugarLauncher methodsFor: 'datastore' stamp: 'bf 9/7/2007 12:18'! propertiesFrom: aProject | preview autoSave | preview := [(Base64MimeConverter mimeEncode: ( ByteArray streamContents: [:s | PNGReadWriter putForm: aProject thumbnail onStream: s]) readStream) contents] ifError: ['']. autoSave := aProject projectParameterAt: #sugarAutoSave ifAbsent: [false]. ^ { 'activity' -> (parameters at: 'BUNDLE_ID'). 'activity_id' -> (autoSave ifTrue: [parameters at: 'ACTIVITY_ID'] ifFalse: ['']). "temp hack for trial-3" 'title:text' -> ((aProject name beginsWith: 'Unnamed' translated) ifTrue: ['Etoys Project' translated] ifFalse: [aProject name]) squeakToUtf8. 'title_set_by_user' -> (aProject currentVersionNumber>0 ifTrue: ['1'] ifFalse: ['0']). 'keep' -> (autoSave ifTrue: ['0'] ifFalse: ['1']). 'mtime' -> (DateAndTime now asString first: 19). 'preview' -> preview. 'icon-color' -> self ownerBuddy colors. } as: Dictionary. ! ! !SugarNavigatorBar methodsFor: 'button actions' stamp: 'bf 9/6/2007 16:19'! quitSqueak ^SugarLauncher isRunningInSugar ifTrue: [SugarLauncher current quit] ifFalse: [super quitSqueak]. ! ! !SugarNavigatorBar methodsFor: 'the actions' stamp: 'bf 9/7/2007 11:47'! publishProject ^SugarLauncher isRunningInSugar ifTrue: [SugarLauncher current save] ifFalse: [super publishProject]. ! ! !SugarLauncher reorganize! ('running' shutDown startUp) ('commands' active: addBuddyKey:args: delBuddyKey:args: nick: putUpInitialBalloonHelp quit save share: welcome:) ('accessing' buddies ownerBuddy) ('dbus' dbusMessageRegistry dispatchDBusMessage: handleActivitySetActive: handleDBusIntrospect: introspect runDBusService: sendDBusMessage: sendDBusMessage:onSuccess:onError: sendDBusMessage:timeout:) ('pipe' fetchCommandsFrom: handlePipeCommand: unknownPipeCommand:) ('events' windowEvent:) ('datastore' createJournalEntry createJournalEntryFor:filename:mimetype: findJournalEntries: getFilename: getFile: getProperties: handleStream:mimetype:titled: makeJournalEntry makeJournalEntryFor:filename:mimetype: propertiesFrom: resumeJournalEntry: updateJournalEntry: updateJournalEntry:for:filename:mimetype:) ('presence' buddiesFromDBus ownerFromDBus) ('testing' isRunningInSugar) ! Project removeSelector: #storeOnServerWithNoInteractionInnards!