/usr/share/amsn/msnp2p/session_manager.tcl is in amsn-data 0.98.9-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | namespace eval ::p2p {
snit::type P2PSessionManager {
variable sessions -array {}
variable trsp_mgr ""
option -handlers {}
constructor {args} {
$self configurelist $args
::Event::registerEvent p2pBlobReceived2 all [list $self On_blob_received]
::Event::registerEvent p2pBlobSent2 all [list $self On_blob_sent]
::Event::registerEvent p2pChunkSent all [list $self On_chunk_sent]
::Event::registerEvent p2pChunkTransferred all [list $self On_chunk_received]
}
destructor {
$self configurelist $args
catch {::Event::unregisterEvent p2pBlobReceived2 all [list $self On_blob_received]}
catch {::Event::unregisterEvent p2pBlobSent2 all [list $self On_blob_sent]}
catch {::Event::unregisterEvent p2pChunkSent all [list $self On_chunk_sent]}
catch {::Event::unregisterEvent p2pChunkTransferred all [list $self On_chunk_received]}
}
method transport_manager { } {
if { $trsp_mgr == "" } {
set trsp_mgr [P2PTransportManager %AUTO%]
}
return $trsp_mgr
}
method register_handler { handler_class} {
set options(-handlers) [lappend options(-handlers) $handler_class]
}
method Register_session { session} {
set sid [$session cget -id]
set sessions($sid) $session
status_log "Registering $session on $sid"
}
method Unregister_session { session } {
status_log "Unregistering session [$session cget -id]"
set sid [$session cget -id]
catch {array unset sessions $sid}
#$trsp_mgr delete_blobs_of_session [$session cget -peer] $sid
if { [$self Search_session_by_peer [$session cget -peer]] == "" } {
$trsp_mgr close_transport [$session cget -peer]
}
}
method On_chunk_sent { event chunk blob } {
set sid [$chunk get_field session_id]
#$self configure -session_id $sid
if { $sid == 0 } {
return
}
set session [$self Get_session $sid]
if { $session == "" } {
return
}
$session On_data_chunk_transferred $chunk $blob
#catch {$chunk destroy}
}
method On_chunk_received { event chunk blob } {
set sid [$chunk get_field session_id]
set session [$self Get_session $sid]
::Event::fireEvent p2pChunkReceived2 p2pSessionManager $session $chunk $blob
#catch {$chunk destroy}
}
method Get_session { sid } {
if { [lsearch [array names sessions] $sid ] >= 0 } {
return $sessions($sid)
}
return ""
}
method Search_session_by_call { cid } {
foreach sid [array names sessions] {
set session $sessions($sid)
if { [info commands $session] == "" } {
#Stale session, unregister
catch {array unset sessions $sid}
continue
}
if { [$session cget -call_id] == $cid } {
return $session
}
}
return ""
}
method Search_session_by_peer { peer } {
foreach session [array names sessions] {
if { [info commands $session] == "" } {
#Stale session, unregister
catch {array unset sessions $sid}
continue
}
if { [$session cget -peer] == $peer } {
return session
}
}
return ""
}
method On_blob_received { event blob } {
#if { [catch {set session [$self Blob_to_session $blob]} res] } {
# status_log "Error: $res"
# return 0
#}
if { [catch {set session [$self Blob_to_session $blob]}]} {
status_log "ERROR: Cannot get this blob's session ID!!!"
return
}
if { $session == "" } {
if { [$blob cget -session_id] != 0 } {
#TODO: send TLP, RESET connection
status_log "No session!!!!!"
return
}
set slp_data [$blob read_data]
set msg [SLPMessage build $slp_data]
$msg configure -application_id [$blob cget -application_id]
set sid [[$msg body] cget -session_id]
if { $sid == 0 } {
status_log "SID shouldn't be 0!!!" black
catch {$msg destroy}
return
}
status_log "Message is [$msg info type] and the body is [[$msg body] info type]"
set tempses [$self Search_session_by_call [$msg cget -call_id]]
if { $tempses != "" } {
set session $tempses
} elseif { [$msg info type] == "::p2p::SLPRequestMessage" } {
set peer [$msg cget -frm]
status_log "Received session request from $peer"
foreach handler $options(-handlers) {
status_log "Trying $handler for [[$msg body] cget -euf_guid]"
if {[$handler Can_handle_message $msg] } {
#@@@@@@ p2pv2: $guid!!!
set session [$handler Handle_message $peer "" $msg]
if { $session != "" } {
status_log "Got session $session"
$self Register_session $session
break
}
}
}
if { $session == "" } {
status_log "Don't know how to handle [[$msg body] cget -euf_guid]"
catch {$msg destroy}
return ""
}
catch {$msg destroy}
} elseif { [[$msg body] info type] == "::p2p::SLPSessionRequestBody" } {
status_log "Unknown session"
catch {$msg destroy}
return ""
} else {
status_log "[$msg info type] : What is this type?"
catch {$msg destroy}
return ""
}
catch {$msg destroy}
}
$session On_blob_received $blob
}
method On_blob_sent {event blob} {
set session [$self Blob_to_session $blob]
if { $session == "" } {
status_log "No session?!?!?!?! Something went VERY wrong" white
return ""
}
$session On_blob_sent $blob
}
#method Find_contact { account} {}
method Blob_to_session { blob} {
set sid [$blob cget -session_id]
if { $sid == 0 } {
set slp_data [$blob read_data]
set message [SLPMessage build $slp_data]
$message configure -application_id [$blob cget -application_id]
set sid [[$message body] cget -session_id]
if { $sid == 0 || $sid == "" } {
set cid [$message cget -call_id]
catch {$message destroy}
return [$self Search_session_by_call $cid]
}
catch {$message destroy}
}
return [$self Get_session $sid]
}
}
}
|