Example #1
0
        private void handleStartAppTransferMessage(StartAppTransferMessage msg, IPAddress sender)
        {
            TransferInfo theTransfer = null;

            lock (Transfers)
            {
                if (!Transfers.ContainsKey(msg.transferId))
                {
                    Debug.WriteLine("Received StartAppTransferMessage for unknown transfer [" + msg.transferId + "]");
                }
                theTransfer = Transfers[msg.transferId];
            }
            if (theTransfer == null)
            {
                return;
            }

            lock (theTransfer) // this will also be accessed by the TransferAgent's receive thread
            {
                theTransfer.Manifest = msg.manifest;
            }
        }
Example #2
0
        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));
            }
        }