コード例 #1
0
 internal void MergeWithDefinition(BrowserDefinition definition)
 {
     foreach (string str in definition.Capabilities.Keys)
     {
         this._capabilities[str] = definition.Capabilities[str];
     }
     foreach (string str2 in definition.Adapters.Keys)
     {
         this._adapters[str2] = definition.Adapters[str2];
     }
     this._htmlTextWriterString = definition.HtmlTextWriterString;
 }
 internal void AddBrowserToCollectionRecursive(BrowserDefinition bd, int depth)
 {
     if (this._browserDefinitionCollection == null)
     {
         this._browserDefinitionCollection = new BrowserDefinitionCollection();
     }
     bd.Depth = depth;
     bd.IsDeviceNode = true;
     this._browserDefinitionCollection.Add(bd);
     foreach (BrowserDefinition definition in bd.Browsers)
     {
         this.AddBrowserToCollectionRecursive(definition, depth + 1);
     }
 }
 internal void AddCustomBrowserToCollectionRecursive(BrowserDefinition bd, int depth, int index)
 {
     if (this._customBrowserDefinitionCollections[index] == null)
     {
         this._customBrowserDefinitionCollections[index] = new BrowserDefinitionCollection();
     }
     bd.Depth = depth;
     bd.IsDeviceNode = true;
     ((BrowserDefinitionCollection) this._customBrowserDefinitionCollections[index]).Add(bd);
     foreach (BrowserDefinition definition in bd.Browsers)
     {
         this.AddCustomBrowserToCollectionRecursive(definition, depth + 1, index);
     }
 }
コード例 #4
0
        internal void MergeWithDefinition(BrowserDefinition definition)
        {
            Debug.Assert(definition.IsRefID);

            // Copy the capabilities
            foreach (String key in definition.Capabilities.Keys)
            {
                this._capabilities[key] = definition.Capabilities[key];
            }

            // Copy the adapter definition
            foreach (String key in definition.Adapters.Keys)
            {
                this._adapters[key] = definition.Adapters[key];
            }

            this._htmlTextWriterString = definition.HtmlTextWriterString;
        }
 internal CodeStatementCollection GenerateTrackedSingleProcessCall(CodeStatementCollection stmts, BrowserDefinition bd, CodeMemberMethod cmm, string prefix)
 {
     CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), prefix + bd.Name + "Process", new CodeExpression[0]);
     expression.Parameters.Add(new CodeVariableReferenceExpression("headers"));
     expression.Parameters.Add(new CodeVariableReferenceExpression("browserCaps"));
     CodeConditionStatement statement = new CodeConditionStatement {
         Condition = expression
     };
     stmts.Add(statement);
     return statement.FalseStatements;
 }
 internal void GenerateSingleProcessCall(BrowserDefinition bd, CodeMemberMethod cmm, string prefix)
 {
     CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), prefix + bd.Name + "Process", new CodeExpression[0]);
     expression.Parameters.Add(new CodeVariableReferenceExpression("headers"));
     expression.Parameters.Add(new CodeVariableReferenceExpression("browserCaps"));
     cmm.Statements.Add(expression);
 }
 private void GenerateSetCapabilitiesCode(BrowserDefinition bd, CodeMemberMethod cmm, ref bool regexWorkerGenerated)
 {
     NameValueCollection capabilities = bd.Capabilities;
     this.AddComment("Capabilities: set capabilities", cmm);
     foreach (string str in capabilities.Keys)
     {
         string str2 = capabilities[str];
         CodeAssignStatement statement = new CodeAssignStatement {
             Left = new CodeIndexerExpression(this._dictionaryRefExpr, new CodeExpression[] { new CodePrimitiveExpression(str) })
         };
         CodePrimitiveExpression expression = new CodePrimitiveExpression(str2);
         if (RegexWorker.RefPat.Match(str2).Success)
         {
             this.GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
             statement.Right = new CodeIndexerExpression(this._regexWorkerRefExpr, new CodeExpression[] { expression });
         }
         else
         {
             statement.Right = expression;
         }
         cmm.Statements.Add(statement);
     }
 }
 internal void GenerateProcessMethod(BrowserDefinition bd, CodeTypeDeclaration ctd)
 {
     this.GenerateProcessMethod(bd, ctd, string.Empty);
 }
コード例 #9
0
        //generate part of the xxxProcess method for assigning capability values
        private void GenerateSetCapabilitiesCode(BrowserDefinition bd, CodeMemberMethod cmm, ref bool regexWorkerGenerated) {
            //GEN: browserCaps[aaa] = "bbb";
            //GEN: browserCaps[xxx] = "yyy";
            NameValueCollection nvc = bd.Capabilities;
            CodeAssignStatement assign;

            AddComment("Capabilities: set capabilities", cmm);
            foreach (string s in nvc.Keys) {
                string capsString = nvc[s];
                //GEN: dictionary["xxx"] = regexWorker["xxx"];
                assign = new CodeAssignStatement();
                assign.Left = new CodeIndexerExpression(
                    _dictionaryRefExpr,
                    new CodeExpression[] { new CodePrimitiveExpression(s) } );

                CodePrimitiveExpression capabilityExpr = new CodePrimitiveExpression(capsString);
                if (RegexWorker.RefPat.Match(capsString).Success) {

                    GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                    assign.Right = new CodeIndexerExpression(
                        _regexWorkerRefExpr,
                        new CodeExpression[] {capabilityExpr});
                }
                else {
                    assign.Right = capabilityExpr;
                }

                cmm.Statements.Add(assign);
            }
        }
コード例 #10
0
        //generate part of the xxxProcess method for running and storing the capture regexes
        private void GenerateCapturesCode(BrowserDefinition bd, CodeMemberMethod cmm, ref bool regexWorkerGenerated) {
            if ((bd.CaptureHeaderChecks.Count == 0) && (bd.CaptureCapabilityChecks.Count == 0)) {
                return;
            }

            if(bd.CaptureHeaderChecks.Count > 0) {
                AddComment("Capture: header values", cmm);
                for(int i = 0; i < bd.CaptureHeaderChecks.Count; i++) {

                    string matchedString = ((CheckPair)bd.CaptureHeaderChecks[i]).MatchString;
                    if (matchedString.Equals(".*")) {
                        continue;
                    }

                    GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                    CodeMethodInvokeExpression cmie = new CodeMethodInvokeExpression(_regexWorkerRefExpr, _processRegexMethod);

                    if (((CheckPair)bd.CaptureHeaderChecks[i]).Header.Equals("User-Agent")) {
                        _headers.Add(String.Empty);
                        cmie.Parameters.Add(new CodeCastExpression(typeof(string),
                            new CodeIndexerExpression(new CodeVariableReferenceExpression(browserCapsVariable), new CodeExpression[] { 
                                new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(String)), "Empty") })));
                    }
                    else {
                        string header = ((CheckPair)bd.CaptureHeaderChecks[i]).Header;
                        _headers.Add(header);

                        //GEN: regexWorker.ProcessRegex((string)headers["xxx"], "xxxRegexString");
                        cmie.Parameters.Add(
                            new CodeCastExpression(typeof(string),
                                                   new CodeIndexerExpression(
                                                       _headersRefExpr,
                                                       new CodeExpression[] { new CodePrimitiveExpression(header) }
                                                       )
                                                   )
                            );
                    }

                    cmie.Parameters.Add(new CodePrimitiveExpression(matchedString));
                    cmm.Statements.Add(cmie);
                }
            }

            if (bd.CaptureCapabilityChecks.Count > 0) {
                AddComment("Capture: capability values", cmm);
                for(int i = 0; i < bd.CaptureCapabilityChecks.Count; i++) {

                    string matchedString = ((CheckPair)bd.CaptureCapabilityChecks[i]).MatchString;
                    if (matchedString.Equals(".*")) {
                        continue;
                    }

                    GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                    //GEN: regexWorker.ProcessRegex((string)dictionary["xxxCapability"], "xxxRegexString");
                    CodeMethodInvokeExpression cmie = new CodeMethodInvokeExpression(_regexWorkerRefExpr, _processRegexMethod);
                    cmie.Parameters.Add(
                        new CodeCastExpression(typeof(string),
                                               new CodeIndexerExpression(
                                                   _dictionaryRefExpr,
                                                   new CodeExpression[] { new CodePrimitiveExpression(((CheckPair)bd.CaptureCapabilityChecks[i]).Header) }
                                                   )
                                               )
                        );

                    cmie.Parameters.Add(new CodePrimitiveExpression(matchedString));
                    cmm.Statements.Add(cmie);
                }
            }
        }
コード例 #11
0
        //generate part of the xxxProcess method for handling determining if the requesting
        //browser meets the regexes for this browser
        private void GenerateIdentificationCode(BrowserDefinition bd, CodeMemberMethod cmm, ref bool regexWorkerGenerated) {

            //GEN: IDictionary dictionary;
            cmm.Statements.Add(new CodeVariableDeclarationStatement(typeof(IDictionary), _dictionaryRefName));

            //GEN: dictionary = browserCaps.Capabilities;
            CodeAssignStatement assign = new CodeAssignStatement(
                _dictionaryRefExpr,
                new CodePropertyReferenceExpression(_browserCapsRefExpr, "Capabilities")
                );
            cmm.Statements.Add(assign);

            bool disableOptimizedKey = false;
            CodeVariableReferenceExpression result = null;
            CodeVariableReferenceExpression headerValue = null;

            if(bd.IdHeaderChecks.Count > 0) {
                AddComment("Identification: check header matches", cmm);
                for (int i = 0; i < bd.IdHeaderChecks.Count; i++) {
                    string matchedString = ((CheckPair)bd.IdHeaderChecks[i]).MatchString;

                    // Skip matching ".*"
                    if (matchedString.Equals(".*")) {
                        continue;
                    }

                    if (headerValue == null) {
                        headerValue = GenerateVarReference(cmm, typeof(string), "headerValue");
                    }

                    CodeAssignStatement valueAssignment = new CodeAssignStatement();
                    cmm.Statements.Add(valueAssignment);
                    valueAssignment.Left = headerValue;

                    if (((CheckPair)bd.IdHeaderChecks[i]).Header.Equals("User-Agent")) {
                        _headers.Add(String.Empty);

                        // GEN: headerValue = ((string)(browserCaps[String.Empty]));
                        valueAssignment.Right = new CodeCastExpression(typeof(string),
                                                new CodeIndexerExpression(
                                                    new CodeVariableReferenceExpression(browserCapsVariable),
                                                    new CodeExpression[] { 
                                                        new CodePropertyReferenceExpression(
                                                        new CodeTypeReferenceExpression(typeof(String)), "Empty") }));
                    }
                    else {
                        string header = ((CheckPair)bd.IdHeaderChecks[i]).Header;
                        _headers.Add(header);

                        //GEN: headerValue = ((String)headers["xxx"]);
                        valueAssignment.Right = new CodeCastExpression(typeof(string),
                                                   new CodeIndexerExpression(
                                                       _headersRefExpr,
                                                       new CodeExpression[] { new CodePrimitiveExpression(header) }
                                                       )
                                                   );

                        disableOptimizedKey = true;
                    }

                    // Don't need to use Regex if matching . only.
                    if (matchedString.Equals(".")) {

                        // Simply return if the header exists.
                        ReturnIfHeaderValueEmpty(cmm, headerValue);

                        continue;
                    }

                    if (result == null) {
                        result = GenerateVarReference(cmm, typeof(bool), _resultVarName);
                    }

                    GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                    CodeMethodInvokeExpression cmie = new CodeMethodInvokeExpression(_regexWorkerRefExpr, _processRegexMethod);

                    cmie.Parameters.Add(headerValue);
                    cmie.Parameters.Add(new CodePrimitiveExpression(matchedString));

                    //GEN: result = regexWorker.ProcessRegex(headerValue, {matchedString});
                    assign = new CodeAssignStatement();
                    assign.Left = result;
                    assign.Right = cmie;
                    cmm.Statements.Add(assign);

                    //GEN: if(result == false) {
                    //GEN:     return false;
                    //GEN: }
                    CodeConditionStatement istatement = new CodeConditionStatement();
                    if(((CheckPair)bd.IdHeaderChecks[i]).NonMatch) {
                        istatement.Condition = new CodeBinaryOperatorExpression(result, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(true));
                    }
                    else {
                        istatement.Condition = new CodeBinaryOperatorExpression(result, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(false));
                    }
                    istatement.TrueStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(false)));
                    cmm.Statements.Add(istatement);
                }
            }

            if (bd.IdCapabilityChecks.Count > 0) {
                AddComment("Identification: check capability matches", cmm);
                for (int i = 0; i < bd.IdCapabilityChecks.Count; i++) {
                    string matchedString = ((CheckPair)bd.IdCapabilityChecks[i]).MatchString;

                    // Skip matching ".*"
                    if (matchedString.Equals(".*")) {
                        continue;
                    }

                    if (headerValue == null) {
                        headerValue = GenerateVarReference(cmm, typeof(string), "headerValue");
                    }

                    CodeAssignStatement valueAssignment = new CodeAssignStatement();
                    cmm.Statements.Add(valueAssignment);
                    valueAssignment.Left = headerValue;
                    valueAssignment.Right = (new CodeCastExpression(typeof(string),
                                                               new CodeIndexerExpression(
                                                                   _dictionaryRefExpr,
                                                                   new CodeExpression[] {
                                                                       new CodePrimitiveExpression(((CheckPair)bd.IdCapabilityChecks[i]).Header)
                                                                   }
                                                                   )
                                                               ));

                    // Don't need to use Regex if matching . only.
                    if (matchedString.Equals(".")) {
                        continue;
                    } 

                    if (result == null) {
                        result = GenerateVarReference(cmm, typeof(bool), _resultVarName);
                    }

                    GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                    //GEN: result = regexWorker.ProcessRegex((string)dictionary["xxxCapability"], "xxxRegexString");
                    CodeMethodInvokeExpression cmie = new CodeMethodInvokeExpression(_regexWorkerRefExpr, _processRegexMethod);

                    cmie.Parameters.Add(headerValue);
                    cmie.Parameters.Add(new CodePrimitiveExpression(matchedString));
                    assign = new CodeAssignStatement();
                    assign.Left = result;
                    assign.Right = cmie;
                    cmm.Statements.Add(assign);

                    //GEN: if(result == false) {
                    //GEN:      return false;
                    //GEN: }
                    CodeConditionStatement istatement = new CodeConditionStatement();
                    if (((CheckPair)bd.IdCapabilityChecks[i]).NonMatch) {
                        istatement.Condition = new CodeBinaryOperatorExpression(result, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(true));
                    }
                    else {
                        istatement.Condition = new CodeBinaryOperatorExpression(result, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(false));
                    }
                    istatement.TrueStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(false)));
                    cmm.Statements.Add(istatement);
                }
            }

            //GEN: browserCaps.DisableOptimizedCacheKey();
            if (disableOptimizedKey) {
                CodeMethodInvokeExpression cme = new CodeMethodInvokeExpression(_browserCapsRefExpr, _disableOptimizedCacheKeyMethodName);
                cmm.Statements.Add(cme);
            }
        }
コード例 #12
0
        internal override void HandleUnRecognizedParentElement(BrowserDefinition bd, bool isDefault)
        {
            // Use the valid type name so we can find the corresponding parent node.
            String parentName = bd.ParentName;
            int hashKey = bd.GetType().GetHashCode() ^ parentName.GetHashCode();

            // Add the refID in front of the list so they gets to be called first.
            if (isDefault) {
                AddStringToHashtable(_defaultBrowserOverrides, hashKey, bd.Name, bd.IsRefID);
            } else {
                AddStringToHashtable(_browserOverrides, hashKey, bd.Name, bd.IsRefID);
            }
        }
コード例 #13
0
        internal void MergeWithDefinition(BrowserDefinition definition) {
            Debug.Assert(definition.IsRefID);

            // Copy the capabilities
            foreach (String key in definition.Capabilities.Keys) {
                this._capabilities[key] = definition.Capabilities[key];
            }

            // Copy the adapter definition
            foreach (String key in definition.Adapters.Keys) {
                this._adapters[key] = definition.Adapters[key];
            }

            this._htmlTextWriterString = definition.HtmlTextWriterString;
        }
 internal override void HandleUnRecognizedParentElement(BrowserDefinition bd, bool isDefault)
 {
     string parentName = bd.ParentName;
     int key = bd.GetType().GetHashCode() ^ parentName.GetHashCode();
     if (isDefault)
     {
         AddStringToHashtable(this._defaultBrowserOverrides, key, bd.Name, bd.IsRefID);
     }
     else
     {
         AddStringToHashtable(this._browserOverrides, key, bd.Name, bd.IsRefID);
     }
 }
 private void GenerateCapturesCode(BrowserDefinition bd, CodeMemberMethod cmm, ref bool regexWorkerGenerated)
 {
     if ((bd.CaptureHeaderChecks.Count != 0) || (bd.CaptureCapabilityChecks.Count != 0))
     {
         if (bd.CaptureHeaderChecks.Count > 0)
         {
             this.AddComment("Capture: header values", cmm);
             for (int i = 0; i < bd.CaptureHeaderChecks.Count; i++)
             {
                 string matchString = ((CheckPair) bd.CaptureHeaderChecks[i]).MatchString;
                 if (!matchString.Equals(".*"))
                 {
                     this.GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                     CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression(this._regexWorkerRefExpr, "ProcessRegex", new CodeExpression[0]);
                     if (((CheckPair) bd.CaptureHeaderChecks[i]).Header.Equals("User-Agent"))
                     {
                         this._headers.Add(string.Empty);
                         expression.Parameters.Add(new CodeCastExpression(typeof(string), new CodeIndexerExpression(new CodeVariableReferenceExpression("browserCaps"), new CodeExpression[] { new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(string)), "Empty") })));
                     }
                     else
                     {
                         string header = ((CheckPair) bd.CaptureHeaderChecks[i]).Header;
                         this._headers.Add(header);
                         expression.Parameters.Add(new CodeCastExpression(typeof(string), new CodeIndexerExpression(this._headersRefExpr, new CodeExpression[] { new CodePrimitiveExpression(header) })));
                     }
                     expression.Parameters.Add(new CodePrimitiveExpression(matchString));
                     cmm.Statements.Add(expression);
                 }
             }
         }
         if (bd.CaptureCapabilityChecks.Count > 0)
         {
             this.AddComment("Capture: capability values", cmm);
             for (int j = 0; j < bd.CaptureCapabilityChecks.Count; j++)
             {
                 string str3 = ((CheckPair) bd.CaptureCapabilityChecks[j]).MatchString;
                 if (!str3.Equals(".*"))
                 {
                     this.GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                     CodeMethodInvokeExpression expression2 = new CodeMethodInvokeExpression(this._regexWorkerRefExpr, "ProcessRegex", new CodeExpression[0]);
                     expression2.Parameters.Add(new CodeCastExpression(typeof(string), new CodeIndexerExpression(this._dictionaryRefExpr, new CodeExpression[] { new CodePrimitiveExpression(((CheckPair) bd.CaptureCapabilityChecks[j]).Header) })));
                     expression2.Parameters.Add(new CodePrimitiveExpression(str3));
                     cmm.Statements.Add(expression2);
                 }
             }
         }
     }
 }
コード例 #16
0
        //generate part of the xxxProcess method for setting specific adapters for this browser
        internal void GenerateSetAdaptersCode(BrowserDefinition bd, CodeMemberMethod cmm) {
            //GEN: browserCaps.Adapters[xxxControl] = yyyAdapter;
            foreach (DictionaryEntry entry in bd.Adapters) {
                string controlString = (string)entry.Key;
                string adapterString = (string)entry.Value;
                CodePropertyReferenceExpression cpre = new CodePropertyReferenceExpression(_browserCapsRefExpr, "Adapters");
                CodeIndexerExpression indexerExpression = new CodeIndexerExpression(
                    cpre,
                    new CodeExpression[] { new CodePrimitiveExpression(controlString) }
                    );
                CodeAssignStatement assignAdapter = new CodeAssignStatement();
                assignAdapter.Left = indexerExpression;
                assignAdapter.Right = new CodePrimitiveExpression(adapterString);
                cmm.Statements.Add(assignAdapter);
            }

            //GEN: browser.HtmlTextWriter = xxxHtmlTextWriter;
            if(bd.HtmlTextWriterString != null) {
                CodeAssignStatement assignHtmlTextWriter = new CodeAssignStatement();
                assignHtmlTextWriter.Left = new CodePropertyReferenceExpression(_browserCapsRefExpr, "HtmlTextWriter");
                assignHtmlTextWriter.Right = new CodePrimitiveExpression(bd.HtmlTextWriterString);
                cmm.Statements.Add(assignHtmlTextWriter);
            }
            return;
        }
 private void GenerateIdentificationCode(BrowserDefinition bd, CodeMemberMethod cmm, ref bool regexWorkerGenerated)
 {
     cmm.Statements.Add(new CodeVariableDeclarationStatement(typeof(IDictionary), "dictionary"));
     CodeAssignStatement statement = new CodeAssignStatement(this._dictionaryRefExpr, new CodePropertyReferenceExpression(this._browserCapsRefExpr, "Capabilities"));
     cmm.Statements.Add(statement);
     bool flag = false;
     CodeVariableReferenceExpression left = null;
     CodeVariableReferenceExpression varExpr = null;
     if (bd.IdHeaderChecks.Count > 0)
     {
         this.AddComment("Identification: check header matches", cmm);
         for (int i = 0; i < bd.IdHeaderChecks.Count; i++)
         {
             string matchString = ((CheckPair) bd.IdHeaderChecks[i]).MatchString;
             if (!matchString.Equals(".*"))
             {
                 if (varExpr == null)
                 {
                     varExpr = this.GenerateVarReference(cmm, typeof(string), "headerValue");
                 }
                 CodeAssignStatement statement2 = new CodeAssignStatement();
                 cmm.Statements.Add(statement2);
                 statement2.Left = varExpr;
                 if (((CheckPair) bd.IdHeaderChecks[i]).Header.Equals("User-Agent"))
                 {
                     this._headers.Add(string.Empty);
                     statement2.Right = new CodeCastExpression(typeof(string), new CodeIndexerExpression(new CodeVariableReferenceExpression("browserCaps"), new CodeExpression[] { new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(string)), "Empty") }));
                 }
                 else
                 {
                     string header = ((CheckPair) bd.IdHeaderChecks[i]).Header;
                     this._headers.Add(header);
                     statement2.Right = new CodeCastExpression(typeof(string), new CodeIndexerExpression(this._headersRefExpr, new CodeExpression[] { new CodePrimitiveExpression(header) }));
                     flag = true;
                 }
                 if (matchString.Equals("."))
                 {
                     this.ReturnIfHeaderValueEmpty(cmm, varExpr);
                 }
                 else
                 {
                     if (left == null)
                     {
                         left = this.GenerateVarReference(cmm, typeof(bool), "result");
                     }
                     this.GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                     CodeMethodInvokeExpression expression3 = new CodeMethodInvokeExpression(this._regexWorkerRefExpr, "ProcessRegex", new CodeExpression[0]);
                     expression3.Parameters.Add(varExpr);
                     expression3.Parameters.Add(new CodePrimitiveExpression(matchString));
                     statement = new CodeAssignStatement {
                         Left = left,
                         Right = expression3
                     };
                     cmm.Statements.Add(statement);
                     CodeConditionStatement statement3 = new CodeConditionStatement();
                     if (((CheckPair) bd.IdHeaderChecks[i]).NonMatch)
                     {
                         statement3.Condition = new CodeBinaryOperatorExpression(left, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(true));
                     }
                     else
                     {
                         statement3.Condition = new CodeBinaryOperatorExpression(left, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(false));
                     }
                     statement3.TrueStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(false)));
                     cmm.Statements.Add(statement3);
                 }
             }
         }
     }
     if (bd.IdCapabilityChecks.Count > 0)
     {
         this.AddComment("Identification: check capability matches", cmm);
         for (int j = 0; j < bd.IdCapabilityChecks.Count; j++)
         {
             string str3 = ((CheckPair) bd.IdCapabilityChecks[j]).MatchString;
             if (!str3.Equals(".*"))
             {
                 if (varExpr == null)
                 {
                     varExpr = this.GenerateVarReference(cmm, typeof(string), "headerValue");
                 }
                 CodeAssignStatement statement4 = new CodeAssignStatement();
                 cmm.Statements.Add(statement4);
                 statement4.Left = varExpr;
                 statement4.Right = new CodeCastExpression(typeof(string), new CodeIndexerExpression(this._dictionaryRefExpr, new CodeExpression[] { new CodePrimitiveExpression(((CheckPair) bd.IdCapabilityChecks[j]).Header) }));
                 if (!str3.Equals("."))
                 {
                     if (left == null)
                     {
                         left = this.GenerateVarReference(cmm, typeof(bool), "result");
                     }
                     this.GenerateRegexWorkerIfNecessary(cmm, ref regexWorkerGenerated);
                     CodeMethodInvokeExpression expression4 = new CodeMethodInvokeExpression(this._regexWorkerRefExpr, "ProcessRegex", new CodeExpression[0]);
                     expression4.Parameters.Add(varExpr);
                     expression4.Parameters.Add(new CodePrimitiveExpression(str3));
                     statement = new CodeAssignStatement {
                         Left = left,
                         Right = expression4
                     };
                     cmm.Statements.Add(statement);
                     CodeConditionStatement statement5 = new CodeConditionStatement();
                     if (((CheckPair) bd.IdCapabilityChecks[j]).NonMatch)
                     {
                         statement5.Condition = new CodeBinaryOperatorExpression(left, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(true));
                     }
                     else
                     {
                         statement5.Condition = new CodeBinaryOperatorExpression(left, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(false));
                     }
                     statement5.TrueStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(false)));
                     cmm.Statements.Add(statement5);
                 }
             }
         }
     }
     if (flag)
     {
         CodeMethodInvokeExpression expression5 = new CodeMethodInvokeExpression(this._browserCapsRefExpr, "DisableOptimizedCacheKey", new CodeExpression[0]);
         cmm.Statements.Add(expression5);
     }
 }
コード例 #18
0
        internal CodeStatementCollection GenerateTrackedSingleProcessCall(CodeStatementCollection stmts, BrowserDefinition bd, CodeMemberMethod cmm, string prefix) {
            //GEN:  if (xProcess(headers, browserCaps)) {
            //      }
            //      else {
            //          ...
            //      }
            CodeMethodInvokeExpression xProcess = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), prefix + bd.Name + "Process");
            xProcess.Parameters.Add(new CodeVariableReferenceExpression(_headersRefName));
            xProcess.Parameters.Add(new CodeVariableReferenceExpression(browserCapsVariable));

            CodeConditionStatement conditionStmt = new CodeConditionStatement();
            conditionStmt.Condition = xProcess;

            stmts.Add(conditionStmt);

            return conditionStmt.FalseStatements;
        }
 internal void GenerateProcessMethod(BrowserDefinition bd, CodeTypeDeclaration ctd, string prefix)
 {
     CodeMemberMethod cmm = new CodeMemberMethod {
         Name = prefix + bd.Name + "Process",
         ReturnType = new CodeTypeReference(typeof(bool)),
         Attributes = MemberAttributes.Private
     };
     CodeParameterDeclarationExpression expression = new CodeParameterDeclarationExpression(typeof(NameValueCollection), "headers");
     cmm.Parameters.Add(expression);
     expression = new CodeParameterDeclarationExpression(typeof(HttpBrowserCapabilities), "browserCaps");
     cmm.Parameters.Add(expression);
     bool regexWorkerGenerated = false;
     this.GenerateIdentificationCode(bd, cmm, ref regexWorkerGenerated);
     this.GenerateCapturesCode(bd, cmm, ref regexWorkerGenerated);
     this.GenerateSetCapabilitiesCode(bd, cmm, ref regexWorkerGenerated);
     this.GenerateSetAdaptersCode(bd, cmm);
     if (bd.IsDeviceNode)
     {
         CodeMethodInvokeExpression expression2 = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("browserCaps"), "AddBrowser", new CodeExpression[0]);
         expression2.Parameters.Add(new CodePrimitiveExpression(bd.ID));
         cmm.Statements.Add(expression2);
     }
     foreach (BrowserDefinition definition in bd.RefGateways)
     {
         this.AddComment("ref gateways, parent=" + bd.ID, cmm);
         this.GenerateSingleProcessCall(definition, cmm);
     }
     if (this.GenerateOverrides && (prefix.Length == 0))
     {
         string methodName = prefix + bd.Name + "ProcessGateways";
         this.GenerateChildProcessMethod(methodName, ctd, false);
         this.GenerateChildProcessInvokeExpression(methodName, cmm, false);
     }
     foreach (BrowserDefinition definition2 in bd.Gateways)
     {
         this.AddComment("gateway, parent=" + bd.ID, cmm);
         this.GenerateSingleProcessCall(definition2, cmm);
     }
     if (this.GenerateOverrides)
     {
         CodeVariableDeclarationStatement statement = new CodeVariableDeclarationStatement(typeof(bool), "ignoreApplicationBrowsers", new CodePrimitiveExpression(bd.Browsers.Count != 0));
         cmm.Statements.Add(statement);
     }
     if (bd.Browsers.Count > 0)
     {
         CodeStatementCollection stmts = cmm.Statements;
         this.AddComment("browser, parent=" + bd.ID, cmm);
         foreach (BrowserDefinition definition3 in bd.Browsers)
         {
             stmts = this.GenerateTrackedSingleProcessCall(stmts, definition3, cmm, prefix);
         }
         if (this.GenerateOverrides)
         {
             CodeAssignStatement statement2 = new CodeAssignStatement {
                 Left = new CodeVariableReferenceExpression("ignoreApplicationBrowsers"),
                 Right = new CodePrimitiveExpression(false)
             };
             stmts.Add(statement2);
         }
     }
     foreach (BrowserDefinition definition4 in bd.RefBrowsers)
     {
         this.AddComment("ref browsers, parent=" + bd.ID, cmm);
         if (definition4.IsDefaultBrowser)
         {
             this.GenerateSingleProcessCall(definition4, cmm, "Default");
         }
         else
         {
             this.GenerateSingleProcessCall(definition4, cmm);
         }
     }
     if (this.GenerateOverrides)
     {
         string str2 = prefix + bd.Name + "ProcessBrowsers";
         this.GenerateChildProcessMethod(str2, ctd, true);
         this.GenerateChildProcessInvokeExpression(str2, cmm, true);
     }
     CodeMethodReturnStatement statement3 = new CodeMethodReturnStatement(new CodePrimitiveExpression(true));
     cmm.Statements.Add(statement3);
     ctd.Members.Add(cmm);
 }
コード例 #20
0
 //generate code to call the xxxProcess for a given browser
 //and store the result in a local variable
 internal void GenerateSingleProcessCall(BrowserDefinition bd, CodeMemberMethod cmm, string prefix) {
     //GEN: xProcess(headers, browserCaps);
     CodeMethodInvokeExpression xProcess = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), prefix + bd.Name + "Process");
     xProcess.Parameters.Add(new CodeVariableReferenceExpression(_headersRefName));
     xProcess.Parameters.Add(new CodeVariableReferenceExpression(browserCapsVariable));
     cmm.Statements.Add(xProcess);
 }
 internal void GenerateSetAdaptersCode(BrowserDefinition bd, CodeMemberMethod cmm)
 {
     foreach (DictionaryEntry entry in bd.Adapters)
     {
         string key = (string) entry.Key;
         string str2 = (string) entry.Value;
         CodePropertyReferenceExpression targetObject = new CodePropertyReferenceExpression(this._browserCapsRefExpr, "Adapters");
         CodeIndexerExpression expression2 = new CodeIndexerExpression(targetObject, new CodeExpression[] { new CodePrimitiveExpression(key) });
         CodeAssignStatement statement = new CodeAssignStatement {
             Left = expression2,
             Right = new CodePrimitiveExpression(str2)
         };
         cmm.Statements.Add(statement);
     }
     if (bd.HtmlTextWriterString != null)
     {
         CodeAssignStatement statement2 = new CodeAssignStatement {
             Left = new CodePropertyReferenceExpression(this._browserCapsRefExpr, "HtmlTextWriter"),
             Right = new CodePrimitiveExpression(bd.HtmlTextWriterString)
         };
         cmm.Statements.Add(statement2);
     }
 }
コード例 #22
0
        internal virtual void ProcessBrowserNode(XmlNode node, BrowserTree browserTree) {

            BrowserDefinition browserInfo = null;

            if (node.Name == "gateway") {
                browserInfo = new GatewayDefinition(node);
            }
            else if (node.Name == "browser") {
                browserInfo = new BrowserDefinition(node);
            }
            else {
                Debug.Assert(node.Name == "defaultBrowser");
                browserInfo = new BrowserDefinition(node, true);
            }

            BrowserDefinition oldNode = (BrowserDefinition)browserTree[browserInfo.Name];

            if (oldNode != null) {
                if (browserInfo.IsRefID) {
                    oldNode.MergeWithDefinition(browserInfo);
                }
                else {
                    throw new ConfigurationErrorsException(SR.GetString(SR.Duplicate_browser_id, browserInfo.ID), node);
                }
            }
            else {
                browserTree[browserInfo.Name] = browserInfo;
            }
        }
 internal void GenerateSingleProcessCall(BrowserDefinition bd, CodeMemberMethod cmm)
 {
     this.GenerateSingleProcessCall(bd, cmm, string.Empty);
 }
コード例 #24
0
        internal void AddBrowserToCollectionRecursive(BrowserDefinition bd, int depth) {
            if (_browserDefinitionCollection == null) {
                _browserDefinitionCollection = new BrowserDefinitionCollection();
            }

            bd.Depth = depth;
            bd.IsDeviceNode = true;
            _browserDefinitionCollection.Add(bd);

            foreach(BrowserDefinition childBrowser in bd.Browsers) {
                AddBrowserToCollectionRecursive(childBrowser, depth + 1);
            }
        }
 internal CodeStatementCollection GenerateTrackedSingleProcessCall(CodeStatementCollection stmts, BrowserDefinition bd, CodeMemberMethod cmm)
 {
     return this.GenerateTrackedSingleProcessCall(stmts, bd, cmm, string.Empty);
 }
コード例 #26
0
 internal virtual void HandleUnRecognizedParentElement(BrowserDefinition bd, bool isDefault) {
     throw new ConfigurationErrorsException(SR.GetString(SR.Browser_parentID_Not_Found, bd.ParentID), bd.XmlNode);
 }
 internal virtual void HandleUnRecognizedParentElement(BrowserDefinition bd, bool isDefault)
 {
     throw new ConfigurationErrorsException(System.Web.SR.GetString("Browser_parentID_Not_Found", new object[] { bd.ParentID }), bd.XmlNode);
 }
コード例 #28
0
        //generate the xxxProcess method for an individual BrowserDefinition
        internal void GenerateProcessMethod(BrowserDefinition bd, CodeTypeDeclaration ctd, string prefix) {
            //GEN: internal bool XxxProcess(NameValueCollection headers, HttpBrowserCapabilities browserCaps)
            CodeMemberMethod cmm = new CodeMemberMethod();
            cmm.Name = prefix + bd.Name + "Process";
            cmm.ReturnType = new CodeTypeReference(typeof(bool));
            cmm.Attributes = MemberAttributes.Private;
            CodeParameterDeclarationExpression cpde = new CodeParameterDeclarationExpression(typeof(NameValueCollection), _headersRefName);
            cmm.Parameters.Add(cpde);
            cpde = new CodeParameterDeclarationExpression(typeof(HttpBrowserCapabilities), browserCapsVariable);
            cmm.Parameters.Add(cpde);

            bool regexWorkerGenerated = false;

            GenerateIdentificationCode(bd, cmm, ref regexWorkerGenerated);
            GenerateCapturesCode(bd, cmm, ref regexWorkerGenerated);
            GenerateSetCapabilitiesCode(bd, cmm, ref regexWorkerGenerated);
            GenerateSetAdaptersCode(bd, cmm);

            // Only add the browser node to the browser collection if it represents a device.
            if (bd.IsDeviceNode) {
                Debug.Assert(!(bd is GatewayDefinition));

                //GEN: browserCaps.AddBrowser("xxx");
                CodeMethodInvokeExpression cmie = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression(browserCapsVariable), "AddBrowser");
                cmie.Parameters.Add(new CodePrimitiveExpression(bd.ID));
                cmm.Statements.Add(cmie);
            }

            // Generate ref gateway elements
            foreach (BrowserDefinition b in bd.RefGateways) {
                AddComment("ref gateways, parent=" + bd.ID, cmm);
                GenerateSingleProcessCall(b, cmm);
            }

            if ((GenerateOverrides) && (prefix.Length == 0)) {
                //Gen: protected virtual void XxxProcessGateways(NameValueCollection headers, HttpBrowserCapabilities browserCaps) ;
                string methodName = prefix + bd.Name + "ProcessGateways";
                GenerateChildProcessMethod(methodName, ctd, false);

                //Gen: XxxProcessGateways(headers,  browserCaps) ;
                GenerateChildProcessInvokeExpression(methodName, cmm, false);
            }

            foreach(BrowserDefinition b in bd.Gateways) {
                AddComment("gateway, parent=" + bd.ID, cmm);
                GenerateSingleProcessCall(b, cmm);
            }

            if (GenerateOverrides) {
                //GEN: bool ignoreApplicationBrowsers = true | false; //bd.Browsers.Count != 0
                CodeVariableDeclarationStatement cvds = new CodeVariableDeclarationStatement(typeof(bool),
                    IgnoreApplicationBrowserVariableName, new CodePrimitiveExpression(bd.Browsers.Count != 0));
                cmm.Statements.Add(cvds);
            }

            if (bd.Browsers.Count > 0) {
                CodeStatementCollection statements = cmm.Statements;
                AddComment("browser, parent=" + bd.ID, cmm);
                foreach (BrowserDefinition b in bd.Browsers) {
                    statements = GenerateTrackedSingleProcessCall(statements, b, cmm, prefix);
                }

                if (GenerateOverrides) {
                    //GEN: ignoreApplicationBrowsers = false;
                    CodeAssignStatement codeAssignStmt = new CodeAssignStatement();
                    codeAssignStmt.Left = new CodeVariableReferenceExpression(IgnoreApplicationBrowserVariableName);
                    codeAssignStmt.Right = new CodePrimitiveExpression(false);
                    statements.Add(codeAssignStmt);
                }
            }

            // Generate ref browser 
            foreach (BrowserDefinition b in bd.RefBrowsers) {
                AddComment("ref browsers, parent=" + bd.ID, cmm);
                if (b.IsDefaultBrowser) {
                    GenerateSingleProcessCall(b, cmm, "Default");
                }
                else {
                    GenerateSingleProcessCall(b, cmm);
                }
            }

            if (GenerateOverrides) {
                //Gen: protected virtual void XxxProcessBrowsers(bool ignoreApplicationBrowsers, NameValueCollection headers, HttpBrowserCapabilities browserCaps) ;
                string methodName = prefix + bd.Name + "ProcessBrowsers";
                GenerateChildProcessMethod(methodName, ctd, true);

                //Gen: XxxProcessBrowsers(ignoreApplicationBrowsers, headers, browserCaps);
                GenerateChildProcessInvokeExpression(methodName, cmm, true);
            }

            //GEN: return true;
            CodeMethodReturnStatement cmrs = new CodeMethodReturnStatement(new CodePrimitiveExpression(true));
            cmm.Statements.Add(cmrs);

            ctd.Members.Add(cmm);
        }
 internal virtual void ProcessBrowserNode(XmlNode node, System.Web.Configuration.BrowserTree browserTree)
 {
     BrowserDefinition definition = null;
     if (node.Name == "gateway")
     {
         definition = new GatewayDefinition(node);
     }
     else if (node.Name == "browser")
     {
         definition = new BrowserDefinition(node);
     }
     else
     {
         definition = new BrowserDefinition(node, true);
     }
     BrowserDefinition definition2 = (BrowserDefinition) browserTree[definition.Name];
     if (definition2 != null)
     {
         if (!definition.IsRefID)
         {
             throw new ConfigurationErrorsException(System.Web.SR.GetString("Duplicate_browser_id", new object[] { definition.ID }), node);
         }
         definition2.MergeWithDefinition(definition);
     }
     else
     {
         browserTree[definition.Name] = definition;
     }
 }
 internal void MergeWithDefinition(BrowserDefinition definition)
 {
     foreach (string str in definition.Capabilities.Keys)
     {
         this._capabilities[str] = definition.Capabilities[str];
     }
     foreach (string str2 in definition.Adapters.Keys)
     {
         this._adapters[str2] = definition.Adapters[str2];
     }
     this._htmlTextWriterString = definition.HtmlTextWriterString;
 }