コード例 #1
0
        public async Task <PersonalCloud> JoinPersonalCloud(int code, string nodedisplayname)
        {
            byte[]        data  = Encoding.UTF8.GetBytes(code.ToString(CultureInfo.InvariantCulture));
            ulong         hcode = xxHash64.ComputeHash(data, data.Length);
            NodeShareInfo spc   = null;

            lock (sharedPCs)
            {
                spc = sharedPCs.FirstOrDefault(x => x.Hash == hcode);
            }

            if (spc != null)
            {
                var ts = DateTime.UtcNow.ToFileTime();
                data = BitConverter.GetBytes(ts + code);
                var newhcode = xxHash64.ComputeHash(data, data.Length);
                var pcresp   = await httpclient.GetAsync(new Uri(new Uri(spc.Url), $"clouds/{spc.PCId}?ts={ts}&hash={newhcode}")).ConfigureAwait(false);

                if (pcresp.IsSuccessStatusCode)
                {
                    var str = await pcresp.Content.ReadAsStringAsync().ConfigureAwait(false);

                    //todo: add response check(hash check).
                    var pci = JsonConvert.DeserializeObject <PersonalCloudInfo>(str);
                    if ((pci == null) || (pci.DisplayName == null))
                    {
                        throw new InviteNotAcceptedException();
                    }
                    var l  = loggerFactory.CreateLogger("PersonalCloud");
                    var pc = pci.ToPersonalCloud(l, this);
                    pc.NodeDisplayName = nodedisplayname;
                    pc.OnNodeAdded(spc, pci.NodeDisplayName, pci.TimeStamp);
                    lock (_PersonalClouds)
                    {
                        _PersonalClouds.Add(pc);
                    }
                    SavePCList();
                    lock (KnownNodes)
                    {
                        KnownNodes.Clear();
                    }
                    await nodeDiscovery.RePublish(NodeId, ServerPort).ConfigureAwait(false);

                    nodeDiscovery.StartSearch();
                    logger.LogDebug($"Join {pc.DisplayName}");
                    return(pc);
                }
                throw new InvalidDeviceResponseException();
            }
            throw new NoDeviceResponseException();
        }
コード例 #2
0
 private void AddShareNode(NodeShareInfo snode)
 {
     lock (sharedPCs)
     {
         if (sharedPCs.FirstOrDefault(x => ((x.NodeId == snode.NodeId) && (x.PCId == snode.PCId))) != null)
         {//already in sharedPCs
             return;
         }
         else
         {
             sharedPCs.Add(snode);
         }
     }
 }
コード例 #3
0
        internal void OnNodeAdded(NodeShareInfo ninfo, string nodename, long pctimeStamp)
        {
            var newinf = new NodeInfoForPC {
                NodeGuid    = ninfo.NodeId,
                PCVersion   = ninfo.PCVersion,
                PCTimeStamp = pctimeStamp,
                Url         = ninfo.Url,
                Name        = nodename
            };

            lock (CachedNodes)
            {
                CachedNodes.Add(newinf);
            }
            OnCachedNodesChange();
        }
コード例 #4
0
        private async Task OnNewNodeDiscovered(NodeInfo node, HttpResponseMessage req)
        {
            var res = JsonConvert.DeserializeObject <List <SSDPPCInfo> >(await req.Content.ReadAsStringAsync().ConfigureAwait(false));

            if (res == null)
            {
                res = new List <SSDPPCInfo>();
            }
            var pcs = PersonalClouds;

            foreach (var pc in pcs)
            {
                await pc.OnNodeUpdate(node, res).ConfigureAwait(false);

                //logger.LogTrace($"{ServerPort}:OnNodeUpdate {pc.NodeDisplayName}");
            }
            if (res?.Count > 0)
            {
                foreach (var item in res)
                {
                    var pc = pcs.Where(x => x.Id == item.Id).FirstOrDefault();
                    if ((pc == null) && (!string.IsNullOrWhiteSpace(item.CodeHash)))
                    {
                        var hash  = ulong.Parse(item.CodeHash, CultureInfo.InvariantCulture);
                        var snode = new NodeShareInfo {
                            Hash      = hash,
                            NodeId    = node.NodeGuid,
                            Url       = node.Url,
                            PCId      = item.Id,
                            PCVersion = node.PCVersion,
                        };
                        AddShareNode(snode);
                        logger.LogTrace($"{ServerPort}:A PC is sharing");
                    }
                    else
                    {
                        RemoveSharedNode(node, item.Id);
                    }
                }
            }
            else
            {
                RemoveSharedNode(node);
            }
        }