private void startReceiveApp(TransferInfo transfer, AppManifest existingFiles) { lock (Transfers) { Transfers.Add(transfer.TransferId, transfer); } subscribeTransferEvents(transfer); // create agent to handle the transfer TransferAgent agent = new TransferAgent(); agent.StartReceive(transfer); // fire event to notify listeners a transfer was created TransferCreatedEventHandler handler = OnTransferCreated; if (handler != null) { handler(this, new TransferEventArgs(transfer)); } // send the peer a request RequestAppTransferMessage newMsg = new RequestAppTransferMessage(); newMsg.appId = transfer.App.AppId; newMsg.transferId = transfer.TransferId; newMsg.listenPort = transfer.Port; if (existingFiles != null) { newMsg.existingFiles = existingFiles; } _tcpAgent.SendMessage(newMsg, transfer.Peer.Address); }
private void handleRequestAppTransferMessage(RequestAppTransferMessage msg, IPAddress sender) { // see if we have the app AppInfo theApp = Library.Apps[msg.appId]; if (theApp == null) { Debug.WriteLine(String.Format("{1} requested AppId {0} but I don't have it", msg.appId, sender.ToString())); return; } // find the peer SyncPeer peer = _peers.Find((aPeer) => { return(aPeer.Address.Equals(sender)); }); Debug.WriteLine(String.Format("I will transfer {0} to {1}", msg.appId, peer.Hostname)); bool isUpdateRequest = msg.existingFiles != null; // build manifest AppManifest manifest = AppManifest.FromAppInfo(theApp, Library, isUpdateRequest); // todo - async/threaded // if peer provided a list of existing files, check our own if (isUpdateRequest) { manifest.RemoveMatchingFiles(msg.existingFiles); } // verify manifest is valid if (manifest == null) { Debug.WriteLine("Could not build manifest for AppId [" + msg.appId + "], aborting."); CancelAppTransferMessage cancelMsg = new CancelAppTransferMessage(); cancelMsg.transferId = msg.transferId; cancelMsg.reason = "Unable to build manifest"; _tcpAgent.SendMessage(cancelMsg, sender); return; } // send "start transfer" message with manifest StartAppTransferMessage newMsg = new StartAppTransferMessage(); newMsg.manifest = manifest; newMsg.transferId = msg.transferId; _tcpAgent.SendMessage(newMsg, sender); // create transfer TransferInfo transfer = new TransferInfo(newMsg.transferId); transfer.Manifest = newMsg.manifest; transfer.App = theApp; transfer.IsSending = true; transfer.Peer = peer; transfer.Port = msg.listenPort; // determine install dir and write string manifestRoot = Library.Path; Utility.EnsureEndsWithSlash(ref manifestRoot); manifestRoot += AppManifest.STEAM_COMMON_DIR + theApp.InstallDir; // todo ensure no path chars in installdir Utility.EnsureEndsWithSlash(ref manifestRoot); DirectoryInfo diManifest = new DirectoryInfo(manifestRoot); if (!diManifest.Exists) { diManifest.Create(); } transfer.ManifestRoot = diManifest; // subscribe to state change notifications (so we can update our status message) subscribeTransferEvents(transfer); // create agent to send the files TransferAgent agent = new TransferAgent(); agent.StartSend(transfer); // fire event to notify listeners a transfer was created TransferCreatedEventHandler handler = OnTransferCreated; if (handler != null) { handler(this, new TransferEventArgs(transfer)); } }