/// <summary>
    /// Creates a CustomerFeed that will associate the data holder's Feed with
    /// the ad customizer placeholder type.
    /// </summary>
    /// <param name="user">The AdWords user.</param>
    /// <param name="dataHolder">The data holder that contains metadata about
    /// the customizer Feed.</param>
    private static void CreateCustomerFeed(AdWordsUser user, CustomizersDataHolder dataHolder) {
      // Get the CustomerFeedService.
      CustomerFeedService customerFeedService = (CustomerFeedService) user.GetService(
          AdWordsService.v201406.CustomerFeedService);

      CustomerFeed customerFeed = new CustomerFeed();
      customerFeed.feedId = dataHolder.FeedId;
      customerFeed.placeholderTypes = new int[] { PLACEHOLDER_AD_CUSTOMIZER };

      // 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;

      CustomerFeed addedCustomerFeed = customerFeedService.mutate(
          new CustomerFeedOperation[] { customerFeedOperation }).value[0];

      Console.WriteLine("Customer feed for feed ID {0} was added.", addedCustomerFeed.feedId);
    }
    /// <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);
      }
    }