123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889 |
- /* 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/blob/main/USING.md#services-and-tickets
- #import <Foundation/Foundation.h>
- #import "GTLRBatchQuery.h"
- #import "GTLRBatchResult.h"
- #import "GTLRDateTime.h"
- #import "GTLRDuration.h"
- #import "GTLRErrorObject.h"
- #import "GTLRObject.h"
- #import "GTLRQuery.h"
- // TODO: Simplify when the 2.0 SessionFetcher is the min dependency.
- #if __has_include(<GTMSessionFetcher/GTMSessionFetcher.h>) // 2.x & CocoaPods
- #import <GTMSessionFetcher/GTMSessionFetcher.h>
- #import <GTMSessionFetcher/GTMSessionFetcherService.h>
- #else // SwiftPM 1.x
- // #import "../GTMSessionFetcher.h"
- // #import "../GTMSessionFetcherService.h"
- #import "GTMSessionFetcher.h"
- #import "GTMSessionFetcherService.h"
- #endif
- NS_ASSUME_NONNULL_BEGIN
- /**
- * The domain used used for NSErrors created by GTLRService query execution.
- */
- FOUNDATION_EXTERN NSString *const kGTLRServiceErrorDomain;
- typedef NS_ENUM(NSInteger, GTLRServiceError) {
- GTLRServiceErrorQueryResultMissing = -3000,
- GTLRServiceErrorBatchResponseUnexpected = -3001,
- GTLRServiceErrorBatchResponseStatusCode = -3002
- };
- /**
- * The kGTLRServiceErrorDomain userInfo key for the server response body.
- */
- FOUNDATION_EXTERN NSString *const kGTLRServiceErrorBodyDataKey;
- /**
- * The kGTLRServiceErrorDomain userInfo key for the response content ID, if appropriate.
- */
- FOUNDATION_EXTERN NSString *const kGTLRServiceErrorContentIDKey;
- /**
- * The domain used for foundation errors created from GTLRErrorObjects that
- * were not originally foundation errors.
- */
- FOUNDATION_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.
- */
- FOUNDATION_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.
- */
- FOUNDATION_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.
- */
- FOUNDATION_EXTERN NSString *const kGTLRServiceTicketStartedNotification;
- /**
- * Notification of a ticket stopping. The notification object is the ticket.
- * This is posted on the main thread.
- */
- FOUNDATION_EXTERN NSString *const kGTLRServiceTicketStoppedNotification;
- /**
- * Notifications when parsing of a server response or entry begins.
- * This is posted on the main thread.
- */
- FOUNDATION_EXTERN NSString *const kGTLRServiceTicketParsingStartedNotification;
- /**
- * Notifications when parsing of a server response or entry ends.
- * This is posted on the main thread.
- */
- FOUNDATION_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
- */
- FOUNDATION_EXTERN NSString *const kXIosBundleIdHeader;
- /**
- * 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;
- // Avoid the warnings for GTMFetcherAuthorizationProtocol in newer
- // GTMSessionFetcher headers. Updating requires a new minimum, and
- // holding of on raising it that current for the moment.
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated"
- /**
- * 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;
- #pragma clang diagnostic pop
- /**
- * 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
|