Exemplo n.º 1
0
        public async Task StartFresh()
        {
            this.Log("Starting fresh");
            if (!Instagram.InternetAvailable())
            {
                this.Log("Internet not available. Exiting.");
                return;
            }

            if (Running)
            {
                throw new Exception("Push client is already running");
            }
            var connectPacket = new FbnsConnectPacket
            {
                Payload = await PayloadProcessor.BuildPayload(ConnectionData)
            };

            Socket = new StreamSocket();
            Socket.Control.KeepAlive = true;
            Socket.Control.NoDelay   = true;
            if (await RequestBackgroundAccess())
            {
                try
                {
                    Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.Wake);
                }
                catch (Exception connectedStandby)
                {
                    this.Log(connectedStandby);
                    this.Log("Connected standby not available");
                    try
                    {
                        Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                    }
                    catch (Exception e)
                    {
                        DebugLogger.LogException(e);
                        this.Log("Failed to transfer socket completely!");
                        return;
                    }
                }
            }
            else
            {
                // if cannot get background access then there is no point of running push client
                return;
            }

            try
            {
                await Socket.ConnectAsync(new HostName(HOST_NAME), "443", SocketProtectionLevel.Tls12);

                _inboundReader                    = new DataReader(Socket.InputStream);
                _outboundWriter                   = new DataWriter(Socket.OutputStream);
                _inboundReader.ByteOrder          = ByteOrder.BigEndian;
                _inboundReader.InputStreamOptions = InputStreamOptions.Partial;
                _outboundWriter.ByteOrder         = ByteOrder.BigEndian;
                _runningTokenSource               = new CancellationTokenSource();
                await FbnsPacketEncoder.EncodePacket(connectPacket, _outboundWriter);
            }
            catch (Exception e)
            {
                DebugLogger.LogException(e);
                Restart();
                return;
            }
            StartPollingLoop();
        }
Exemplo n.º 2
0
        public async Task StartFresh()
        {
            try
            {
                Debug.WriteLine($"{nameof(PushClient)}: Starting fresh.");
                if (_loopGroup != null)
                {
                    await Shutdown();
                }
                _loopGroup = new SingleThreadEventLoop();

                var connectPacket = new FbnsConnectPacket
                {
                    Payload = await PayloadProcessor.BuildPayload(ConnectionData)
                };

                Socket = new StreamSocket();
                Socket.Control.KeepAlive = true;
                Socket.Control.NoDelay   = true;
                if (await RequestBackgroundAccess())
                {
                    try
                    {
                        Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.Wake);
                    }
                    catch (Exception connectedStandby)
                    {
                        Debug.WriteLine(connectedStandby);
                        Debug.WriteLine($"{nameof(PushClient)}: Connected standby not available.");
                        try
                        {
                            Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                        }
                        catch (Exception e)
                        {
#if !DEBUG
                            Crashes.TrackError(e);
#endif
                            Debug.WriteLine(e);
                            Debug.WriteLine($"{nameof(PushClient)}: Failed to transfer socket completely!");
                            await Shutdown().ConfigureAwait(false);

                            return;
                        }
                    }
                }

                await Socket.ConnectAsync(new HostName(HOST_NAME), "443", SocketProtectionLevel.Tls12);

                var streamSocketChannel = new StreamSocketChannel(Socket);
                streamSocketChannel.Pipeline.AddLast(new FbnsPacketEncoder(), new FbnsPacketDecoder(), this);

                await _loopGroup.RegisterAsync(streamSocketChannel).ConfigureAwait(false);

                await streamSocketChannel.WriteAndFlushAsync(connectPacket).ConfigureAwait(false);
            }
            catch (Exception e)
            {
#if !DEBUG
                Crashes.TrackError(e);
#endif
                await Shutdown().ConfigureAwait(false);
            }
        }