/// <summary>
    /// Creates a new Feed for ad customizers.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <returns>A new CustomizersDataHolder, populated with the feed ID and
    /// attribute IDs of the new Feed.</returns>
    private static CustomizersDataHolder CreateCustomizerFeed(AdWordsUser user) {
      // Get the FeedService.
      FeedService feedService = (FeedService) user.GetService(AdWordsService.v201406.FeedService);

      Feed customizerFeed = new Feed();
      customizerFeed.name = "CustomizerFeed";

      FeedAttribute nameAttribute = new FeedAttribute();
      nameAttribute.name = "Name";
      nameAttribute.type = FeedAttributeType.STRING;

      FeedAttribute priceAttribute = new FeedAttribute();
      priceAttribute.name = "Price";
      priceAttribute.type = FeedAttributeType.STRING;

      FeedAttribute dateAttribute = new FeedAttribute();
      dateAttribute.name = "Date";
      dateAttribute.type = FeedAttributeType.DATE_TIME;

      customizerFeed.attributes = new FeedAttribute[] {
          nameAttribute, priceAttribute, dateAttribute
      };

      FeedOperation feedOperation = new FeedOperation();
      feedOperation.operand = customizerFeed;
      feedOperation.@operator = (Operator.ADD);

      Feed addedFeed = feedService.mutate(new FeedOperation[] { feedOperation }).value[0];

      CustomizersDataHolder dataHolder = new CustomizersDataHolder();
      dataHolder.FeedId = addedFeed.id;
      dataHolder.NameFeedAttributeId = addedFeed.attributes[0].id;
      dataHolder.PriceFeedAttributeId = addedFeed.attributes[1].id;
      dataHolder.DateFeedAttributeId = addedFeed.attributes[2].id;

      Console.WriteLine("Feed with name '{0}' and ID {1} was added with:\n", addedFeed.name,
          dataHolder.FeedId);
      Console.WriteLine("  Name attribute ID {0}\n", dataHolder.NameFeedAttributeId);
      Console.WriteLine("  Price attribute ID {0}\n", dataHolder.PriceFeedAttributeId);
      Console.WriteLine("  Date attribute ID {0}\n", dataHolder.DateFeedAttributeId);

      return dataHolder;
    }
    private static void createSiteLinksFeed(
      AdWordsUser user, SiteLinksDataHolder siteLinksData) {
      // Get the FeedService.
      FeedService feedService = (FeedService) user.GetService(AdWordsService.v201406.FeedService);

      // Create attributes.
      FeedAttribute textAttribute = new FeedAttribute();
      textAttribute.type = FeedAttributeType.STRING;
      textAttribute.name = "Link Text";
      FeedAttribute urlAttribute = new FeedAttribute();
      urlAttribute.type = FeedAttributeType.URL;
      urlAttribute.name = "Link URL";

      // Create the feed.
      Feed siteLinksFeed = new Feed();
      siteLinksFeed.name = "Feed For Site Links";
      siteLinksFeed.attributes = new FeedAttribute[] {textAttribute, urlAttribute};
      siteLinksFeed.origin = FeedOrigin.USER;

      // Create operation.
      FeedOperation operation = new FeedOperation();
      operation.operand = siteLinksFeed;
      operation.@operator = Operator.ADD;

      // Add the feed.
      FeedReturnValue result = feedService.mutate(new FeedOperation[] {operation});

      Feed savedFeed = result.value[0];
      siteLinksData.SiteLinksFeedId = savedFeed.id;
      FeedAttribute[] savedAttributes = savedFeed.attributes;
      siteLinksData.LinkTextFeedAttributeId = savedAttributes[0].id;
      siteLinksData.LinkUrlFeedAttributeId = savedAttributes[1].id;
      Console.WriteLine("Feed with name {0} and ID {1} with linkTextAttributeId {2}"
          + " and linkUrlAttributeId {3} was created.", savedFeed.name, savedFeed.id,
          savedAttributes[0].id, savedAttributes[1].id);
    }
    /// <summary>
    /// Runs the code example.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="placesEmailAddress">The email address for Google Places
    /// account.</param>
    /// <param name="placesAccessToken">The OAuth2 access token for Google
    /// Places account.</param>
    public void Run(AdWordsUser user, string placesEmailAddress, string placesAccessToken) {
      FeedService feedService = (FeedService) user.GetService(AdWordsService.v201406.FeedService);

      CustomerFeedService customerFeedService = (CustomerFeedService) user.GetService(
          AdWordsService.v201406.CustomerFeedService);

      // Create a feed that will sync to the Google Places account specified
      // by placesEmailAddress. Do not add FeedAttributes to this object,
      // as AdWords will add them automatically because this will be a
      // system generated feed.
      Feed placesFeed = new Feed();
      placesFeed.name = String.Format("Places feed #{0}", ExampleUtilities.GetRandomString());

      PlacesLocationFeedData feedData = new PlacesLocationFeedData();
      feedData.emailAddress = placesEmailAddress;
      OAuthInfo oAuthInfo = new OAuthInfo();
      oAuthInfo.httpMethod = "GET";
      oAuthInfo.httpRequestUrl = "https://www.google.com/local/add";
      oAuthInfo.httpAuthorizationHeader = string.Format("Bearer {0}", placesAccessToken);
      feedData.oAuthInfo = oAuthInfo;

      placesFeed.systemFeedGenerationData = feedData;

      // Since this feed's feed items will be managed by AdWords,
      // you must set its origin to ADWORDS.
      placesFeed.origin = FeedOrigin.ADWORDS;

      // Create an operation to add the feed.
      FeedOperation feedOperation = new FeedOperation();
      feedOperation.operand = placesFeed;
      feedOperation.@operator = Operator.ADD;

      try {
        // Add the feed. Since it is a system generated feed, AdWords will
        // automatically:
        // 1. Set up the FeedAttributes on the feed.
        // 2. Set up a FeedMapping that associates the FeedAttributes of the
        //    feed with the placeholder fields of the LOCATION placeholder
        //    type.
        FeedReturnValue addFeedResult = feedService.mutate(new FeedOperation[] { feedOperation });
        Feed addedFeed = addFeedResult.value[0];
        Console.WriteLine("Added places feed with ID {0}", addedFeed.id);

        // Add a CustomerFeed that associates the feed with this customer for
        // the LOCATION placeholder type.
        CustomerFeed customerFeed = new CustomerFeed();
        customerFeed.feedId = addedFeed.id;
        customerFeed.placeholderTypes = new int[] { PLACEHOLDER_LOCATION };

        // Create a matching function that will always evaluate to true.
        Function customerMatchingFunction = new Function();
        ConstantOperand constOperand = new ConstantOperand();
        constOperand.type = ConstantOperandConstantType.BOOLEAN;
        constOperand.booleanValue = true;
        customerMatchingFunction.lhsOperand = new FunctionArgumentOperand[] { constOperand };
        customerMatchingFunction.@operator = FunctionOperator.IDENTITY;
        customerFeed.matchingFunction = customerMatchingFunction;

        // Create an operation to add the customer feed.
        CustomerFeedOperation customerFeedOperation = new CustomerFeedOperation();
        customerFeedOperation.operand = customerFeed;
        customerFeedOperation.@operator = Operator.ADD;

        // After the completion of the Feed ADD operation above the added feed
        // will not be available for usage in a CustomerFeed until the sync
        // between the AdWords and Places accounts completes.  The loop below
        // will retry adding the CustomerFeed up to ten times with an
        // exponential back-off policy.
        CustomerFeed addedCustomerFeed = null;

        AdWordsAppConfig config = new AdWordsAppConfig();
        config.RetryCount = 10;

        ErrorHandler errorHandler = new ErrorHandler(config);
        do {
          try {
            CustomerFeedReturnValue customerFeedResult =
                customerFeedService.mutate(new CustomerFeedOperation[] { customerFeedOperation });
            addedCustomerFeed = customerFeedResult.value[0];

            Console.WriteLine("Added CustomerFeed for feed ID {0} and placeholder type {1}",
                addedCustomerFeed.feedId, addedCustomerFeed.placeholderTypes[0]);
            break;
          } catch (AdWordsApiException e) {
            ApiException apiException = (ApiException) e.ApiException;
            foreach (ApiError error in apiException.errors) {
              if (error is CustomerFeedError) {
                if ((error as CustomerFeedError).reason ==
                    CustomerFeedErrorReason.MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE) {
                  errorHandler.DoExponentialBackoff();
                  errorHandler.IncrementRetriedAttempts();
                } else {
                  throw;
                }
              }
            }

          }
        } while (errorHandler.HaveMoreRetryAttemptsLeft());

        // OPTIONAL: Create a CampaignFeed to specify which FeedItems to use at
        // the Campaign level.  This will be similar to the CampaignFeed in the
        // AddSiteLinks example, except you can also filter based on the
        // business name and category of each FeedItem by using a
        // FeedAttributeOperand in your matching function.

        // OPTIONAL: Create an AdGroupFeed for even more fine grained control
        // over which feed items are used at the AdGroup level.
      } catch (Exception ex) {
        throw new System.ApplicationException("Failed to create customer feed.", ex);
      }
    }