public void Read(TProtocol iprot)
        {
            iprot.IncrementRecursionDepth();
            try
            {
                TField field;
                iprot.ReadStructBegin();
                while (true)
                {
                    field = iprot.ReadFieldBegin();
                    if (field.Type == TType.Stop)
                    {
                        break;
                    }
                    switch (field.ID)
                    {
                    case 1:
                        if (field.Type == TType.Struct)
                        {
                            SdkAuthRequest = new THSdkAuthRequest();
                            SdkAuthRequest.Read(iprot);
                        }
                        else
                        {
                            TProtocolUtil.Skip(iprot, field.Type);
                        }
                        break;

                    case 2:
                        if (field.Type == TType.Struct)
                        {
                            ProcessAppOpenRequest = new THProcessAppOpenRequest();
                            ProcessAppOpenRequest.Read(iprot);
                        }
                        else
                        {
                            TProtocolUtil.Skip(iprot, field.Type);
                        }
                        break;

                    default:
                        TProtocolUtil.Skip(iprot, field.Type);
                        break;
                    }
                    iprot.ReadFieldEnd();
                }
                iprot.ReadStructEnd();
            }
            finally
            {
                iprot.DecrementRecursionDepth();
            }
        }
        public void ProcessReferrer(string referrer, Action <ReferralData> onSuccess, Action <GetSocialError> onError)
        {
            var appOpenRequest = new THProcessAppOpenRequest
            {
                IsNewInstall = _stateController.IsNewInstall,
                ReferrerData = new Dictionary <THAppOpenSource, Dictionary <THAppOpenKey, string> >
                {
                    { THAppOpenSource.Manual, new Dictionary <THAppOpenKey, string>
                      {
                          { THAppOpenKey.Value, referrer }
                      } }
                }
            };

            LogRequest("processAppOpen", "isNewInstall=" + appOpenRequest.IsNewInstall + "; referrer=" + referrer);
            WithHadesClient(client =>
            {
                try
                {
                    var rpcReferralData = client.processAppOpen(SessionId, appOpenRequest);
                    var referralData    = rpcReferralData.ToReferralData();
                    Ui(() =>
                    {
                        LogResponse("processAppOpen", rpcReferralData);
                        onSuccess.SafeCall(referralData);
                    });
                }
                catch (THErrors errors)
                {
                    if (errors.Errors.First().ErrorCode == THErrorCode.SIErrProcessAppOpenNoMatch)
                    {
                        Ui(() =>
                        {
                            LogResponse("processAppOpen", null);
                            onSuccess.SafeCall(null);
                        });
                    }
                    else
                    {
                        throw;
                    }
                }
            }, onError);
        }