GBA002/Pods/GoogleAPIClientForREST/Source/Objects/GTLRService.h
Riley Testut 6cca0f244f Replaces frameworks with static libraries
As of iOS 13.3.1, apps installed with free developer accounts that contain embedded frameworks fail to launch. To work around this, we now link all dependencies via Cocoapods as static libraries.
2020-02-03 19:28:23 -08:00

880 lines
30 KiB
Objective-C

/* Copyright (c) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Service object documentation:
// https://github.com/google/google-api-objectivec-client-for-rest/wiki#services-and-tickets
#import <Foundation/Foundation.h>
#import "GTLRDefines.h"
#import "GTLRBatchQuery.h"
#import "GTLRBatchResult.h"
#import "GTLRDateTime.h"
#import "GTLRDuration.h"
#import "GTLRErrorObject.h"
#import "GTLRObject.h"
#import "GTLRQuery.h"
@class GTMSessionFetcher;
@class GTMSessionFetcherService;
@protocol GTMFetcherAuthorizationProtocol;
NS_ASSUME_NONNULL_BEGIN
/**
* The domain used used for NSErrors created by GTLRService query execution.
*/
extern NSString *const kGTLRServiceErrorDomain;
typedef NS_ENUM(NSInteger, GTLRServiceError) {
GTLRServiceErrorQueryResultMissing = -3000,
GTLRServiceErrorBatchResponseUnexpected = -3001,
GTLRServiceErrorBatchResponseStatusCode = -3002
};
/**
* The kGTLRServiceErrorDomain userInfo key for the server response body.
*/
extern NSString *const kGTLRServiceErrorBodyDataKey;
/**
* The kGTLRServiceErrorDomain userInfo key for the response content ID, if appropriate.
*/
extern NSString *const kGTLRServiceErrorContentIDKey;
/**
* The domain used for foundation errors created from GTLRErrorObjects that
* were not originally foundation errors.
*/
extern NSString *const kGTLRErrorObjectDomain;
/**
* The userInfo key for a GTLRErrorObject for errors with domain kGTLRErrorObjectDomain
* when the error was created from a structured JSON error response body.
*/
extern NSString *const kGTLRStructuredErrorKey;
/**
* A constant ETag for when updating or deleting a single entry, telling
* the server to replace the current value unconditionally.
*
* Do not use this in entries in a batch feed.
*/
extern NSString *const kGTLRETagWildcard;
/**
* Notification of a ticket starting. The notification object is the ticket.
* This is posted on the main thread.
*
* Use the stopped notification to log all requests made by the library.
*/
extern NSString *const kGTLRServiceTicketStartedNotification;
/**
* Notification of a ticket stopping. The notification object is the ticket.
* This is posted on the main thread.
*/
extern NSString *const kGTLRServiceTicketStoppedNotification;
/**
* Notifications when parsing of a server response or entry begins.
* This is posted on the main thread.
*/
extern NSString *const kGTLRServiceTicketParsingStartedNotification;
/**
* Notifications when parsing of a server response or entry ends.
* This is posted on the main thread.
*/
extern NSString *const kGTLRServiceTicketParsingStoppedNotification;
/**
* The header name used to send an Application's Bundle Identifier.
* For more information on adding API restrictions see the docs:
* https://cloud.google.com/docs/authentication/api-keys#api_key_restrictions
*/
extern NSString *const kXIosBundleIdHeader;
@class GTLRServiceTicket;
/**
* Callback block for query execution.
*
* @param callbackTicket The ticket that tracked query execution.
* @param object The result of query execution. This will be derived from
* GTLRObject. The object may be nil for operations such as DELETE which
* do not return an object. The object will be a GTLRBatchResult for
* batch operations, and GTLRDataObject for media downloads.
* @param callbackError If non-nil, the query execution failed. For batch requests,
* this may be nil even if individual queries in the batch have failed.
*/
typedef void (^GTLRServiceCompletionHandler)(GTLRServiceTicket *callbackTicket,
id _Nullable object,
NSError * _Nullable callbackError);
/**
* Callback block for upload of query data.
*
* @param progressTicket The ticket that tracks query execution.
* @param totalBytesUploaded Number of bytes uploaded so far.
* @param totalBytesExpectedToUpload Number of bytes expected to be uploaded.
*/
typedef void (^GTLRServiceUploadProgressBlock)(GTLRServiceTicket *progressTicket,
unsigned long long totalBytesUploaded,
unsigned long long totalBytesExpectedToUpload);
/**
* Callback block invoked when an eror occurs during query execution.
*
* @param retryTicket The ticket that tracks query execution.
* @param suggestedWillRetry Flag indicating if the library would retry this without a retry block.
* @param fetchError The error that occurred. If the domain is
* kGTMSessionFetcherStatusDomain then the error's code is the server
* response status. Details on the error from the server are available
* in the userInfo via the keys kGTLRStructuredErrorKey and
* NSLocalizedDescriptionKey.
*
* @return YES if the request should be retried.
*/
typedef BOOL (^GTLRServiceRetryBlock)(GTLRServiceTicket *retryTicket,
BOOL suggestedWillRetry,
NSError * _Nullable fetchError);
/**
* Block to be invoked by a test block.
*
* @param object The faked object, if any, to be passed to the test code's completion handler.
* @param error The faked error if any, to be passed to the test code's completion handler.
*/
typedef void (^GTLRServiceTestResponse)(id _Nullable object, NSError *_Nullable error);
/**
* A test block enables testing of query execution without any network activity.
*
* The test block must finish by calling the response block, passing either an object
* (GTLRObject or GTLRBatchResult) or an NSError.
*
* The query is available to the test block code as testTicket.originalQuery.
*
* Because query execution is asynchronous, the test code must wait for a callback,
* either with GTLRService's waitForTicket:timeout:fetchedObject:error: or with
* XCTestCase's waitForExpectationsWithTimeout:
*
* Example usage is available in GTLRServiceTest.
*
* @param testTicket The ticket that tracks query execution.
* @param testResponse A block that must be invoked by the test block. This may be invoked
* synchronously or asynchornously.
*/
typedef void (^GTLRServiceTestBlock)(GTLRServiceTicket *testTicket,
GTLRServiceTestResponse testResponse);
#pragma mark -
/**
* Base class for the service that executes queries and manages tickets.
*
* Client apps will typically use a generated subclass of GTLRService.
*/
@interface GTLRService : NSObject
#pragma mark Query Execution
/**
* Executes the supplied query
*
* Success is indicated in the completion handler by a nil error parameter, not by a non-nil
* object parameter.
*
* The callback block is invoked exactly once unless the ticket is cancelled.
* The callback will be called on the service's callback queue.
*
* Various execution parameters will be taken from the service's properties, unless overridden
* in the query's @c executionParameters property.
*
* A query may only be executed a single time. To reuse a query, make a copy before executing
* it.
*
* To get a NSURLRequest that represents the query, use @c -[GTLRService requestForQuery:]
*
* @param query The API query, either a subclass of GTLRQuery, or a GTLRBatchQuery.
* @param handler The execution callback block.
*
* @return A ticket for tracking or canceling query execution.
*/
- (GTLRServiceTicket *)executeQuery:(id<GTLRQueryProtocol>)query
completionHandler:(nullable GTLRServiceCompletionHandler)handler;
/**
* Executes the supplied query
*
* The callback is invoked exactly once unless the ticket is cancelled.
* The callback will be called on the service's callbackQueue.
* Various execution parameters will be taken from the service's properties, unless overridden
* in the query's @c executionParameters property.
*
* The selector should have a signature matching:
* @code
* - (void)serviceTicket:(GTLRServiceTicket *)callbackTicket
* finishedWithObject:(GTLRObject *)object
* error:(NSError *)callbackError
* @endcode
*
* @param query The API query, either a subclass of GTLRQuery, or a GTLRBatchQuery.
* @param delegate The object to be with the selector to be invoked upon completion.
* @param finishedSelector The selector to be invoked upon completion.
*
* @return A ticket for tracking or canceling query execution.
*/
- (GTLRServiceTicket *)executeQuery:(id<GTLRQueryProtocol>)query
delegate:(nullable id)delegate
didFinishSelector:(nullable SEL)finishedSelector;
/**
* Enable automatic pagination.
*
* A ticket can optionally do a sequence of fetches for queries where repeated requests
* with a @c nextPageToken query parameter is required to retrieve all pages of
* the response collection. The client's callback is invoked only when all items have
* been retrieved, or an error has occurred.
*
* The final object may be a combination of multiple page responses
* so it may not be the same as if all results had been returned in a single
* page. Some fields of the response may reflect only the final page's values.
*
* Automatic page fetches will return an error if more than 25 page fetches are
* required. For debug builds, this will log a warning to the console when more
* than 2 page fetches occur, as a reminder that the query's @c maxResults parameter
* should probably be increased to specify more items returned per page.
*
* Automatic page accumulation is available for query result objects that are derived
* from GTLRCollectionObject.
*
* This may also be specified for a single query in the query's @c executionParameters property.
*
* Default value is NO.
*/
@property(nonatomic, assign) BOOL shouldFetchNextPages;
/**
* Some services require a developer key for quotas and limits.
*
* If you have enabled the iOS API Key Restriction, you will want
* to manually set the @c APIKeyRestrictionBundleID property, or
* use -setMainBundleIDRestrictionWithAPIKey: to set your API key
* and set the restriction to the main bundle's bundle id.
*/
@property(nonatomic, copy, nullable) NSString *APIKey;
/**
* The Bundle Identifier to use for the API key restriction. This will be
* sent in an X-Ios-Bundle-Identifier header; for more information see
* the API key documentation
* https://cloud.google.com/docs/authentication/api-keys#api_key_restrictions
*/
@property(nonatomic, copy, nullable) NSString *APIKeyRestrictionBundleID;
/**
* Helper method to set the @c APIKey to the given value and set the
* @c APIKeyRestrictionBundleID to the main bundle's bundle identifier.
*/
- (void)setMainBundleIDRestrictionWithAPIKey:(NSString *)apiKey;
/**
* An authorizer adds user authentication headers to the request as needed.
*
* This may be overridden on individual queries with the @c shouldSkipAuthorization property.
*/
@property(nonatomic, retain, nullable) id <GTMFetcherAuthorizationProtocol> authorizer;
/**
* Enable fetcher retry support. See the explanation of retry support in @c GTMSessionFetcher.h
*
* Default value is NO, but retry is also enabled if the retryBlock is not nil.
*
* This may also be specified for a single query in the query's @c executionParameters property.
*/
@property(nonatomic, assign, getter=isRetryEnabled) BOOL retryEnabled;
/**
* A retry block may be provided to inspect and change retry criteria.
*
* This may also be specified for a single query in the query's @c executionParameters property.
*/
@property(atomic, copy, nullable) GTLRServiceRetryBlock retryBlock;
/**
* The maximum retry interval. Retries occur at increasing intervals, up to the specified maximum.
*
* This may also be specified for a single query in the query's @c executionParameters property.
*/
@property(nonatomic, assign) NSTimeInterval maxRetryInterval;
#pragma mark Fetch Object by Resource URL
/**
* Fetch an object given the resource URL. This is appropriate when the object's
* full link is known, such as from a selfLink response property.
*
* @param resourceURL The URL of the object to be fetched.
* @param objectClass The GTLRObject subclass to be instantiated. If nil, the library
* will try to infer the class from the object's "kind" string property.
* @param executionParameters Values to override the service's properties when executing the
* ticket.
* @param handler The execution callback block.
*
* @return A ticket for tracking or canceling query execution.
*/
- (GTLRServiceTicket *)fetchObjectWithURL:(NSURL *)resourceURL
objectClass:(nullable Class)objectClass
executionParameters:(nullable GTLRServiceExecutionParameters *)executionParameters
completionHandler:(nullable GTLRServiceCompletionHandler)handler;
#pragma mark Support for Client Tests
/**
* A test block can be provided to test service calls without any network activity.
*
* See the description of @c GTLRServiceTestBlock for additional details.
*
* This may also be specified for a single query in the query's @c executionParameters property.
*
* A service instance for testing can also be created with @c +mockServiceWithFakedObject
*/
@property(nonatomic, copy, nullable) GTLRServiceTestBlock testBlock;
#pragma mark Converting a Query to an NSURLRequest
/**
* Creates a NSURLRequest from the query object and from properties on this service
* (additionalHTTPHeaders, additionalURLQueryParameters, APIKey) without executing
* it. This can be useful for using @c GTMSessionFetcher or @c NSURLSession to
* perform the fetch.
*
* For requests to non-public resources, the request will not yet be authorized;
* that can be done using the GTLR service's authorizer. Creating a @c GTMSessionFetcher
* from the GTLRService's @c fetcherService will take care of authorization as well.
*
* This works only for GET queries, and only for an individual query, not a batch query.
*
* @note @c Unlike executeQuery:, requestForQuery: does not release the query's callback blocks.
*
* @param query The query used to create the request.
*
* @return A request suitable for use with @c GTMSessionFetcher or @c NSURLSession
*/
- (NSMutableURLRequest *)requestForQuery:(GTLRQuery *)query;
#pragma mark User Properties
/**
* The service properties dictionary is copied to become the initial property dictionary
* for each ticket, augmented by a query's execution parameter's properties.
*/
@property(nonatomic, copy, nullable) NSDictionary<NSString *, id> *serviceProperties;
#pragma mark JSON to GTLRObject Mapping
/**
* Specifies subclasses to be created instead of standard library objects, allowing
* an app to add properties and methods to GTLR objects.
*
* This is just a helper method that sets the service's objectClassResolver:.
*
* Example:
* @code
* NSDictionary *surrogates = @{
* [MyDriveFile class] : [GTLRDrive_File_Surrogate class],
* [MyDriveFileList class] : [GTLRDrive_FileList_Surrogate class]
* };
* [service setSurrogates:surrogates];
* @endcode
*/
- (void)setSurrogates:(NSDictionary <Class, Class>*)surrogates;
/**
* Used to decide what GTLRObject subclass to make from the received JSON.
*
* This defaults to a resolver that will use any kindStringToClassMap the service
* provides.
*
* To use a standard resolver with a surrogates dictionary, invoke setSurrogates: instead
* of setting this property.
*/
@property(nonatomic, strong) id<GTLRObjectClassResolver> objectClassResolver;
/**
* A dictionary mapping "kind" strings to the GTLObject subclasses that should
* be created for JSON with the given kind.
*/
+ (NSDictionary<NSString *, Class> *)kindStringToClassMap;
#pragma mark Request Settings
/**
* The queue used to invoked callbacks. By default, the main queue is used for callbacks.
*/
@property(nonatomic, retain) dispatch_queue_t callbackQueue;
/**
* Allows the application to make non-SSL and localhost requests for testing.
*
* Default value is NO.
*/
@property(nonatomic, assign) BOOL allowInsecureQueries;
/**
* The fetcher service creates the fetcher instances for this API service.
*
* Applications may set this to an authorized fetcher service created elsewhere
* in the app, or may take the fetcher service created by this GTLRService and use it
* to create fetchers independent of this service.
*/
@property(nonatomic, retain) GTMSessionFetcherService *fetcherService;
#pragma mark Custom User Agents
/**
* Applications needing an additional identifier in the server logs may specify one
* through this property and it will be added to the existing UserAgent. It should
* already be a valid identifier as no cleaning/validation is done.
*/
@property(nonatomic, copy, nullable) NSString *userAgentAddition;
/**
* A base user-agent based on the application signature in the Info.plist settings.
*
* Most applications should not explicitly set this property. Any string provided will
* be cleaned of inappropriate characters.
*/
@property(nonatomic, copy, nullable) NSString *userAgent;
/**
* The request user agent includes the library and OS version appended to the
* base userAgent, along with the optional addition string.
*/
@property(nonatomic, readonly, nullable) NSString *requestUserAgent;
/**
* A precise base userAgent string identifying the application. No cleaning of characters
* is done. Library-specific details will be appended.
*
* @param userAgent A wire-ready user agent string.
*/
- (void)setExactUserAgent:(nullable NSString *)userAgent;
/**
* A precise userAgent string to send on requests; no cleaning is done. When
* set, requestUserAgent will be exactly this, no library or system information
* will be auto added.
*
* @param requestUserAgent A wire-ready user agent string.
*/
- (void)overrideRequestUserAgent:(nullable NSString *)requestUserAgent;
/**
* Any additional URL query parameters for the queries executed by this service.
*
* Individual queries may have additionalURLQueryParameters specified as well.
*/
@property(atomic, copy, nullable) NSDictionary<NSString *, NSString *> *additionalURLQueryParameters;
/**
* Any additional HTTP headers for this queries executed by this service.
*
* Individual queries may have additionalHTTPHeaders specified as well.
*/
@property(atomic, copy, nullable) NSDictionary<NSString *, NSString *> *additionalHTTPHeaders;
#pragma mark Request URL Construction
/*
* The URL for where to send a Query is built out of these parts
* ( https://developers.google.com/discovery/v1/using#build-compose ) :
*
* service.rootURLString + service.servicePath + query.pathURITemplate
*
* Note: odds are these both should end in a '/', so make sure any value you
* provide will combine correctly with the above rules.
*/
/**
* The scheme and host for the API server. This may be modified to point at a test server.
*/
@property(nonatomic, copy) NSString *rootURLString;
/**
* The path for the specific API service instance, relative to the rootURLString.
*/
@property(nonatomic, copy) NSString *servicePath;
/**
* A path fragment added in to URLs before "servicePath" to build
* the full URL used for resumable media uploads.
*/
@property(nonatomic, copy) NSString *resumableUploadPath;
/**
* A path fragment added in to URLs before "servicePath" to build
* the full URL used for simple and multipart media uploads.
*/
@property(nonatomic, copy) NSString *simpleUploadPath;
/**
* A path fragment added in to URLs before "servicePath" to build
* the full URL used for batch requests.
*/
@property(nonatomic, copy) NSString *batchPath;
#pragma mark Resumable Uploads
/**
* A block called to track upload progress.
*
* A query's service execution parameters may be used to override this.
*/
@property(nonatomic, copy, nullable) GTLRServiceUploadProgressBlock uploadProgressBlock;
/**
* The default chunk size for resumable uploads. This defaults to kGTLRStandardUploadChunkSize
* for service subclasses that support chunked uploads.
*/
@property(nonatomic, assign) NSUInteger serviceUploadChunkSize;
/**
* Service subclasses may override this to specify their own default chunk size for
* resumable uploads.
*/
+ (NSUInteger)defaultServiceUploadChunkSize;
#pragma mark Internal
/////////////////////////////////////////////////////////////////////////////////////////////
//
// Properties below are used by the library and should not typically be set by client apps.
//
/////////////////////////////////////////////////////////////////////////////////////////////
/**
* The queue used for parsing JSON responses.
*
* Applications should typically not change this.
*/
@property(nonatomic, retain) dispatch_queue_t parseQueue;
/**
* If this service supports pretty printing the JSON on the wire, these are
* the names of the query params that enable it. If there are any values,
* the library disables pretty printing to save on bandwidth.
*
* Applications should typically not need change this; the ServiceGenerator
* will set this up when generating the custom subclass.
*/
@property(nonatomic, strong, nullable) NSArray<NSString *> *prettyPrintQueryParameterNames;
/**
* This indicates if the API requires a "data" JSON element to wrap the payload
* on requests and responses.
*
* Applications should typically not change this.
*/
@property(nonatomic, assign, getter=isDataWrapperRequired) BOOL dataWrapperRequired;
@end
@interface GTLRService (TestingSupport)
/**
* Convenience method to create a mock GTLR service just for testing.
*
* Queries executed by this mock service will not perform any network operation,
* but will invoke callbacks and provide the supplied object or error to the
* completion handler.
*
* You can make more customized mocks by setting the test block property of a service
* or a query's execution parameters. The test block can inspect the query as ticket.originalQuery
* to customize test behavior.
*
* See the description of @c GTLRServiceTestBlock for more details on customized testing.
*
* Example usage is in the unit test method @c testService_MockService_Succeeding
*
* @param object An object derived from GTLRObject to be passed to query completion handlers.
* @param error An error to be passed to query completion handlers.
*
* @return A mock instance of the service, suitable for unit testing.
*/
+ (instancetype)mockServiceWithFakedObject:(nullable id)object
fakedError:(nullable NSError *)error;
/**
* Wait synchronously for fetch to complete (strongly discouraged)
*
* This method is intended for use only in unit tests and command-line tools.
* Unit tests may also use XCTest's waitForExpectationsWithTimeout: instead of
* or after this method.
*
* This method just runs the current event loop until the fetch completes
* or the timout limit is reached. This may discard unexpected events
* that occur while spinning, so it's really not appropriate for use
* in serious applications.
*
* Returns YES if an object was successfully fetched. If the wait
* timed out, returns NO and the returned error is nil.
*
* @param ticket The ticket being executed.
* @param timeoutInSeconds Maximum duration to wait.
*
* @return YES if the ticket completed or was cancelled; NO if the wait timed out.
*/
- (BOOL)waitForTicket:(GTLRServiceTicket *)ticket
timeout:(NSTimeInterval)timeoutInSeconds;
@end
#pragma mark -
/**
* Service execution parameters may be set on an individual query
* to alter the service's settings.
*/
@interface GTLRServiceExecutionParameters : NSObject<NSCopying>
/**
* Override the service's property @c shouldFetchNextPages for automatic pagination.
*
* A BOOL value should be specified.
*/
@property(atomic, strong, nullable) NSNumber *shouldFetchNextPages;
/**
* Override the service's property @c shouldFetchNextPages for enabling automatic retries.
*
* A BOOL value should be specified.
*
* Retry is also enabled if the retryBlock is not nil
*/
@property(atomic, strong, nullable, getter=isRetryEnabled) NSNumber *retryEnabled;
/**
* Override the service's property @c retryBlock for customizing automatic retries.
*/
@property(atomic, copy, nullable) GTLRServiceRetryBlock retryBlock;
/**
* Override the service's property @c maxRetryInterval for customizing automatic retries.
*
* A NSTimeInterval (double) value should be specified.
*/
@property(atomic, strong, nullable) NSNumber *maxRetryInterval;
/**
* Override the service's property @c uploadProgressBlock for monitoring upload progress.
*/
@property(atomic, copy, nullable) GTLRServiceUploadProgressBlock uploadProgressBlock;
/**
* Override the service's property @c callbackQueue for invoking callbacks.
*/
@property(atomic, retain, nullable) dispatch_queue_t callbackQueue;
/**
* Override the service's property @c testBlock for simulating query execution.
*
* See the description of @c GTLRServiceTestBlock for additional details.
*/
@property(atomic, copy, nullable) GTLRServiceTestBlock testBlock;
/**
* Override the service's property @c objectClassResolver for controlling object class selection.
*/
@property(atomic, strong, nullable) id<GTLRObjectClassResolver> objectClassResolver;
/**
* The ticket's properties are the service properties, with the execution parameter's
* ticketProperties added (replacing any keys already present from the service.)
*/
@property(atomic, copy, nullable) NSDictionary<NSString *, id> *ticketProperties;
/**
* Indicates if any of the execution parameters properties are set.
*/
@property(nonatomic, readonly) BOOL hasParameters;
@end
/**
* A ticket tracks the progress of a query being executed.
*/
@interface GTLRServiceTicket : NSObject
- (instancetype)init NS_UNAVAILABLE;
/**
* The service that issued this ticket.
*
* This method may be invoked from any thread.
*/
@property(atomic, readonly) GTLRService *service;
#pragma mark Execution Control
/**
* Invoking cancelTicket stops the fetch if it is in progress. The query callbacks
* will not be invoked.
*
* This method may be invoked from any thread.
*/
- (void)cancelTicket;
/**
* The time the ticket was created.
*/
@property(atomic, readonly) NSDate *creationDate;
/**
* Pause the ticket execution. This is valid only for chunked, resumable upload queries.
*/
- (void)pauseUpload;
/**
* Resume the ticket execution. This is valid only for chunked, resumable upload queries.
*/
- (void)resumeUpload;
/**
* Checks if the ticket execution is paused.
*/
@property(nonatomic, readonly, getter=isUploadPaused) BOOL uploadPaused;
/**
* The request being fetched for the query.
*/
@property(nonatomic, readonly, nullable) NSURLRequest *fetchRequest;
/**
* The fetcher being used for the query request.
*/
@property(atomic, readonly, nullable) GTMSessionFetcher *objectFetcher;
/**
* The queue used for query callbacks.
*/
@property(atomic, readonly) dispatch_queue_t callbackQueue;
/**
* The API key used for the query requeat.
*/
@property(atomic, readonly, nullable) NSString *APIKey;
/**
* The Bundle Identifier to use for the API key restriciton.
*/
@property(atomic, readonly, nullable) NSString *APIKeyRestrictionBundleID;
#pragma mark Status
/**
* The server's response status for the query's fetch, if available.
*/
@property(nonatomic, readonly) NSInteger statusCode;
/**
* The error resulting from the query's fetch, if available.
*/
@property(nonatomic, readonly, nullable) NSError *fetchError;
/**
* A flag indicating if the query's callbacks have been invoked.
*/
@property(nonatomic, readonly) BOOL hasCalledCallback;
/**
* A flag indicating if the query execution was cancelled by the client app.
*/
@property(atomic, readonly, getter=isCancelled) BOOL cancelled;
#pragma mark Pagination
/**
* A flag indicating if automatic pagination is enabled for the query.
*/
@property(nonatomic, readonly) BOOL shouldFetchNextPages;
/**
* The number of pages fetched, if automatic pagination is enabled for the query and multiple
* pages have been fetched.
*/
@property(nonatomic, readonly) NSUInteger pagesFetchedCounter;
#pragma mark User Properties
/**
* Ticket properties a way to pass values via the ticket for the convenience of the client app.
*
* Ticket properties are initialized from serviceProperties and augmented by the ticketProperties
* of the query's execution parameters.
*/
@property(nonatomic, readonly, nullable) NSDictionary<NSString *, id> *ticketProperties;
#pragma mark Payload
/**
* The object being uploaded via POST, PUT, or PATCH.
*/
@property(nonatomic, readonly, nullable) GTLRObject *postedObject;
/**
* The object downloaded for the query, after parsing.
*/
@property(nonatomic, readonly, nullable) GTLRObject *fetchedObject;
/**
* The query currently being fetched by this ticket. This may not be the original query when
* fetching a second or later pages.
*/
@property(atomic, readonly, nullable) id<GTLRQueryProtocol> executingQuery;
/**
* The query used to create this ticket
*/
@property(atomic, readonly, nullable) id<GTLRQueryProtocol> originalQuery;
/**
* The @c GTLRObjectClassResolver for controlling object class selection.
*/
@property(atomic, readonly, strong) id<GTLRObjectClassResolver> objectClassResolver;
/**
* The query from within the ticket's batch request with the given ID.
*
* @param requestID The desired ticket's request ID.
*
* @return The query with the specified ID, if found.
*/
- (nullable GTLRQuery *)queryForRequestID:(NSString *)requestID;
@end
/**
* The library doesn't use GTLRObjectCollectionImpl, but it provides a concrete implementation
* so the methods do not cause private method errors in Xcode/AppStore review.
*/
@interface GTLRObjectCollectionImpl : GTLRObject
@property(nonatomic, copy) NSString *nextPageToken;
@end
NS_ASSUME_NONNULL_END