PackageLoader fileInPackage: 'OsmoNetwork'. Object subclass: IPAConnection [ | socket demuxer queue muxer dispatcher sccp ipa | IPAConnection class >> initWith: anAddr port: aPort token: aToken [ ^ (self new) socket: (Sockets.Socket remote: anAddr port: aPort); setup: aToken; yourself ] socket: aSocket [ socket := aSocket. ] setup: aToken [ demuxer := Osmo.IPADemuxer initOn: socket. queue := SharedQueue new. muxer := Osmo.IPAMuxer initOn: queue. dispatcher := Osmo.IPADispatcher new. dispatcher initialize. sccp := SCCPHadler new. sccp registerOn: dispatcher. ipa := Osmo.IPAProtoHandler new. ipa registerOn: dispatcher. ipa muxer: muxer. ipa token: aToken ] serve [ [true] whileTrue: [ [ | data | data := demuxer next. dispatcher dispatch: data first with: data second. self drainSendQueue. ] on: SystemExceptions.EndOfStream do: [:e | ^ false ] ] ] drainSendQueue [ [queue isEmpty] whileFalse: [ | msg | msg := queue next. socket nextPutAllFlush: msg. ] ] ] Object subclass: IPAConfig [ | socket addr port token connection sem | addr: anAddr port: aPort [ addr := anAddr. port := aPort. ] token: aToken [ token := aToken. ] connect [ sem := Semaphore new. connection := IPAConnection initWith: addr port: port token: token. ] connection [ ^ connection ] serve [ [ connection serve. 'Connection disconnected' printNl. sem signal. ] fork. ] semaphore [ ^ sem ] ]