|
libs3
trunk
|
00001 00027 #ifndef LIBS3_H 00028 #define LIBS3_H 00029 00030 #include <stdint.h> 00031 #include <sys/select.h> 00032 00033 00034 #ifdef __cplusplus 00035 extern "C" { 00036 #endif 00037 00038 00121 #define S3_MAX_HOSTNAME_SIZE 255 00122 00126 #define S3_DEFAULT_HOSTNAME "s3.amazonaws.com" 00127 00128 00133 #define S3_MAX_BUCKET_NAME_SIZE 255 00134 00138 #define S3_MAX_KEY_SIZE 1024 00139 00140 00145 #define S3_MAX_METADATA_SIZE 2048 00146 00147 00151 #define S3_METADATA_HEADER_NAME_PREFIX "x-amz-meta-" 00152 00153 00161 #define S3_MAX_METADATA_COUNT \ 00162 (S3_MAX_METADATA_SIZE / (sizeof(S3_METADATA_HEADER_NAME_PREFIX "nv") - 1)) 00163 00164 00170 #define S3_MAX_ACL_GRANT_COUNT 100 00171 00172 00177 #define S3_MAX_GRANTEE_EMAIL_ADDRESS_SIZE 128 00178 00179 00184 #define S3_MAX_GRANTEE_USER_ID_SIZE 128 00185 00186 00191 #define S3_MAX_GRANTEE_DISPLAY_NAME_SIZE 128 00192 00193 00199 #define S3_MAX_AUTHENTICATED_QUERY_STRING_SIZE \ 00200 (sizeof("https:///") + S3_MAX_HOSTNAME_SIZE + (S3_MAX_KEY_SIZE * 3) + \ 00201 sizeof("?AWSAccessKeyId=") + 32 + sizeof("&Expires=") + 32 + \ 00202 sizeof("&Signature=") + 28 + 1) 00203 00204 00210 #define S3_INIT_WINSOCK 1 00211 00212 00217 #define S3_INIT_ALL (S3_INIT_WINSOCK) 00218 00219 00229 typedef enum 00230 { 00231 S3StatusOK , 00232 00237 S3StatusInternalError , 00238 S3StatusOutOfMemory , 00239 S3StatusInterrupted , 00240 S3StatusInvalidBucketNameTooLong , 00241 S3StatusInvalidBucketNameFirstCharacter , 00242 S3StatusInvalidBucketNameCharacter , 00243 S3StatusInvalidBucketNameCharacterSequence , 00244 S3StatusInvalidBucketNameTooShort , 00245 S3StatusInvalidBucketNameDotQuadNotation , 00246 S3StatusQueryParamsTooLong , 00247 S3StatusFailedToInitializeRequest , 00248 S3StatusMetaDataHeadersTooLong , 00249 S3StatusBadMetaData , 00250 S3StatusBadContentType , 00251 S3StatusContentTypeTooLong , 00252 S3StatusBadMD5 , 00253 S3StatusMD5TooLong , 00254 S3StatusBadCacheControl , 00255 S3StatusCacheControlTooLong , 00256 S3StatusBadContentDispositionFilename , 00257 S3StatusContentDispositionFilenameTooLong , 00258 S3StatusBadContentEncoding , 00259 S3StatusContentEncodingTooLong , 00260 S3StatusBadIfMatchETag , 00261 S3StatusIfMatchETagTooLong , 00262 S3StatusBadIfNotMatchETag , 00263 S3StatusIfNotMatchETagTooLong , 00264 S3StatusHeadersTooLong , 00265 S3StatusKeyTooLong , 00266 S3StatusUriTooLong , 00267 S3StatusXmlParseFailure , 00268 S3StatusEmailAddressTooLong , 00269 S3StatusUserIdTooLong , 00270 S3StatusUserDisplayNameTooLong , 00271 S3StatusGroupUriTooLong , 00272 S3StatusPermissionTooLong , 00273 S3StatusTargetBucketTooLong , 00274 S3StatusTargetPrefixTooLong , 00275 S3StatusTooManyGrants , 00276 S3StatusBadGrantee , 00277 S3StatusBadPermission , 00278 S3StatusXmlDocumentTooLarge , 00279 S3StatusNameLookupError , 00280 S3StatusFailedToConnect , 00281 S3StatusServerFailedVerification , 00282 S3StatusConnectionFailed , 00283 S3StatusAbortedByCallback , 00284 00288 S3StatusErrorAccessDenied , 00289 S3StatusErrorAccountProblem , 00290 S3StatusErrorAmbiguousGrantByEmailAddress , 00291 S3StatusErrorBadDigest , 00292 S3StatusErrorBucketAlreadyExists , 00293 S3StatusErrorBucketAlreadyOwnedByYou , 00294 S3StatusErrorBucketNotEmpty , 00295 S3StatusErrorCredentialsNotSupported , 00296 S3StatusErrorCrossLocationLoggingProhibited , 00297 S3StatusErrorEntityTooSmall , 00298 S3StatusErrorEntityTooLarge , 00299 S3StatusErrorExpiredToken , 00300 S3StatusErrorIncompleteBody , 00301 S3StatusErrorIncorrectNumberOfFilesInPostRequest , 00302 S3StatusErrorInlineDataTooLarge , 00303 S3StatusErrorInternalError , 00304 S3StatusErrorInvalidAccessKeyId , 00305 S3StatusErrorInvalidAddressingHeader , 00306 S3StatusErrorInvalidArgument , 00307 S3StatusErrorInvalidBucketName , 00308 S3StatusErrorInvalidDigest , 00309 S3StatusErrorInvalidLocationConstraint , 00310 S3StatusErrorInvalidPayer , 00311 S3StatusErrorInvalidPolicyDocument , 00312 S3StatusErrorInvalidRange , 00313 S3StatusErrorInvalidSecurity , 00314 S3StatusErrorInvalidSOAPRequest , 00315 S3StatusErrorInvalidStorageClass , 00316 S3StatusErrorInvalidTargetBucketForLogging , 00317 S3StatusErrorInvalidToken , 00318 S3StatusErrorInvalidURI , 00319 S3StatusErrorKeyTooLong , 00320 S3StatusErrorMalformedACLError , 00321 S3StatusErrorMalformedXML , 00322 S3StatusErrorMaxMessageLengthExceeded , 00323 S3StatusErrorMaxPostPreDataLengthExceededError , 00324 S3StatusErrorMetadataTooLarge , 00325 S3StatusErrorMethodNotAllowed , 00326 S3StatusErrorMissingAttachment , 00327 S3StatusErrorMissingContentLength , 00328 S3StatusErrorMissingSecurityElement , 00329 S3StatusErrorMissingSecurityHeader , 00330 S3StatusErrorNoLoggingStatusForKey , 00331 S3StatusErrorNoSuchBucket , 00332 S3StatusErrorNoSuchKey , 00333 S3StatusErrorNotImplemented , 00334 S3StatusErrorNotSignedUp , 00335 S3StatusErrorOperationAborted , 00336 S3StatusErrorPermanentRedirect , 00337 S3StatusErrorPreconditionFailed , 00338 S3StatusErrorRedirect , 00339 S3StatusErrorRequestIsNotMultiPartContent , 00340 S3StatusErrorRequestTimeout , 00341 S3StatusErrorRequestTimeTooSkewed , 00342 S3StatusErrorRequestTorrentOfBucketError , 00343 S3StatusErrorSignatureDoesNotMatch , 00344 S3StatusErrorSlowDown , 00345 S3StatusErrorTemporaryRedirect , 00346 S3StatusErrorTokenRefreshRequired , 00347 S3StatusErrorTooManyBuckets , 00348 S3StatusErrorUnexpectedContent , 00349 S3StatusErrorUnresolvableGrantByEmailAddress , 00350 S3StatusErrorUserKeyMustBeSpecified , 00351 S3StatusErrorUnknown , 00352 00357 S3StatusHttpErrorMovedTemporarily , 00358 S3StatusHttpErrorBadRequest , 00359 S3StatusHttpErrorForbidden , 00360 S3StatusHttpErrorNotFound , 00361 S3StatusHttpErrorConflict , 00362 S3StatusHttpErrorUnknown 00363 } S3Status; 00364 00365 00376 typedef enum 00377 { 00378 S3ProtocolHTTPS = 0, 00379 S3ProtocolHTTP = 1 00380 } S3Protocol; 00381 00382 00395 typedef enum 00396 { 00397 S3UriStyleVirtualHost = 0, 00398 S3UriStylePath = 1 00399 } S3UriStyle; 00400 00401 00414 typedef enum 00415 { 00416 S3GranteeTypeAmazonCustomerByEmail = 0, 00417 S3GranteeTypeCanonicalUser = 1, 00418 S3GranteeTypeAllAwsUsers = 2, 00419 S3GranteeTypeAllUsers = 3, 00420 S3GranteeTypeLogDelivery = 4 00421 } S3GranteeType; 00422 00423 00439 typedef enum 00440 { 00441 S3PermissionRead = 0, 00442 S3PermissionWrite = 1, 00443 S3PermissionReadACP = 2, 00444 S3PermissionWriteACP = 3, 00445 S3PermissionFullControl = 4 00446 } S3Permission; 00447 00448 00462 typedef enum 00463 { 00464 S3CannedAclPrivate = 0, /* private */ 00465 S3CannedAclPublicRead = 1, /* public-read */ 00466 S3CannedAclPublicReadWrite = 2, /* public-read-write */ 00467 S3CannedAclAuthenticatedRead = 3 /* authenticated-read */ 00468 } S3CannedAcl; 00469 00470 00479 typedef struct S3RequestContext S3RequestContext; 00480 00481 00486 typedef struct S3NameValue 00487 { 00491 const char *name; 00492 00496 const char *value; 00497 } S3NameValue; 00498 00499 00506 typedef struct S3ResponseProperties 00507 { 00512 const char *requestId; 00513 00518 const char *requestId2; 00519 00525 const char *contentType; 00526 00534 uint64_t contentLength; 00535 00539 const char *server; 00540 00547 const char *eTag; 00548 00557 int64_t lastModified; 00558 00563 int metaDataCount; 00564 00571 const S3NameValue *metaData; 00572 } S3ResponseProperties; 00573 00574 00581 typedef struct S3AclGrant 00582 { 00586 S3GranteeType granteeType; 00596 union 00597 { 00602 struct 00603 { 00608 char emailAddress[S3_MAX_GRANTEE_EMAIL_ADDRESS_SIZE]; 00609 } amazonCustomerByEmail; 00614 struct 00615 { 00619 char id[S3_MAX_GRANTEE_USER_ID_SIZE]; 00623 char displayName[S3_MAX_GRANTEE_DISPLAY_NAME_SIZE]; 00624 } canonicalUser; 00625 } grantee; 00629 S3Permission permission; 00630 } S3AclGrant; 00631 00632 00639 typedef struct S3BucketContext 00640 { 00645 const char *hostName; 00646 00650 const char *bucketName; 00651 00655 S3Protocol protocol; 00656 00661 S3UriStyle uriStyle; 00662 00666 const char *accessKeyId; 00667 00671 const char *secretAccessKey; 00672 } S3BucketContext; 00673 00674 00680 typedef struct S3ListBucketContent 00681 { 00685 const char *key; 00686 00691 int64_t lastModified; 00692 00697 const char *eTag; 00698 00702 uint64_t size; 00703 00708 const char *ownerId; 00709 00714 const char *ownerDisplayName; 00715 } S3ListBucketContent; 00716 00717 00723 typedef struct S3PutProperties 00724 { 00729 const char *contentType; 00730 00736 const char *md5; 00737 00742 const char *cacheControl; 00743 00751 const char *contentDispositionFilename; 00752 00758 const char *contentEncoding; 00759 00765 int64_t expires; 00766 00771 S3CannedAcl cannedAcl; 00772 00776 int metaDataCount; 00777 00783 const S3NameValue *metaData; 00784 } S3PutProperties; 00785 00786 00791 typedef struct S3GetConditions 00792 { 00799 int64_t ifModifiedSince; 00800 00807 int64_t ifNotModifiedSince; 00808 00815 const char *ifMatchETag; 00816 00823 const char *ifNotMatchETag; 00824 } S3GetConditions; 00825 00826 00832 typedef struct S3ErrorDetails 00833 { 00838 const char *message; 00839 00843 const char *resource; 00844 00849 const char *furtherDetails; 00850 00855 int extraDetailsCount; 00856 00862 S3NameValue *extraDetails; 00863 } S3ErrorDetails; 00864 00865 00883 typedef S3Status (S3ResponsePropertiesCallback) 00884 (const S3ResponseProperties *properties, void *callbackData); 00885 00886 00903 typedef void (S3ResponseCompleteCallback)(S3Status status, 00904 const S3ErrorDetails *errorDetails, 00905 void *callbackData); 00906 00907 00926 typedef S3Status (S3ListServiceCallback)(const char *ownerId, 00927 const char *ownerDisplayName, 00928 const char *bucketName, 00929 int64_t creationDateSeconds, 00930 void *callbackData); 00931 00932 00963 typedef S3Status (S3ListBucketCallback)(int isTruncated, 00964 const char *nextMarker, 00965 int contentsCount, 00966 const S3ListBucketContent *contents, 00967 int commonPrefixesCount, 00968 const char **commonPrefixes, 00969 void *callbackData); 00970 00971 00990 typedef int (S3PutObjectDataCallback)(int bufferSize, char *buffer, 00991 void *callbackData); 00992 00993 01012 typedef S3Status (S3GetObjectDataCallback)(int bufferSize, const char *buffer, 01013 void *callbackData); 01014 01015 01025 typedef struct S3ResponseHandler 01026 { 01032 S3ResponsePropertiesCallback *propertiesCallback; 01033 01040 S3ResponseCompleteCallback *completeCallback; 01041 } S3ResponseHandler; 01042 01043 01048 typedef struct S3ListServiceHandler 01049 { 01053 S3ResponseHandler responseHandler; 01054 01059 S3ListServiceCallback *listServiceCallback; 01060 } S3ListServiceHandler; 01061 01062 01067 typedef struct S3ListBucketHandler 01068 { 01072 S3ResponseHandler responseHandler; 01073 01080 S3ListBucketCallback *listBucketCallback; 01081 } S3ListBucketHandler; 01082 01083 01088 typedef struct S3PutObjectHandler 01089 { 01093 S3ResponseHandler responseHandler; 01094 01101 S3PutObjectDataCallback *putObjectDataCallback; 01102 } S3PutObjectHandler; 01103 01104 01109 typedef struct S3GetObjectHandler 01110 { 01114 S3ResponseHandler responseHandler; 01115 01123 S3GetObjectDataCallback *getObjectDataCallback; 01124 } S3GetObjectHandler; 01125 01126 01169 S3Status S3_initialize(const char *userAgentInfo, int flags, 01170 const char *defaultS3HostName); 01171 01172 01178 void S3_deinitialize(); 01179 01180 01187 const char *S3_get_status_name(S3Status status); 01188 01189 01229 S3Status S3_validate_bucket_name(const char *bucketName, S3UriStyle uriStyle); 01230 01231 01258 S3Status S3_convert_acl(char *aclXml, char *ownerId, char *ownerDisplayName, 01259 int *aclGrantCountReturn, S3AclGrant *aclGrants); 01260 01261 01272 int S3_status_is_retryable(S3Status status); 01273 01274 01297 S3Status S3_create_request_context(S3RequestContext **requestContextReturn); 01298 01299 01308 void S3_destroy_request_context(S3RequestContext *requestContext); 01309 01310 01324 S3Status S3_runall_request_context(S3RequestContext *requestContext); 01325 01326 01345 S3Status S3_runonce_request_context(S3RequestContext *requestContext, 01346 int *requestsRemainingReturn); 01347 01348 01379 S3Status S3_get_request_context_fdsets(S3RequestContext *requestContext, 01380 fd_set *readFdSet, fd_set *writeFdSet, 01381 fd_set *exceptFdSet, int *maxFd); 01382 01383 01398 int64_t S3_get_request_context_timeout(S3RequestContext *requestContext); 01399 01400 01430 S3Status S3_generate_authenticated_query_string 01431 (char *buffer, const S3BucketContext *bucketContext, 01432 const char *key, int64_t expires, const char *resource); 01433 01434 01457 void S3_list_service(S3Protocol protocol, const char *accessKeyId, 01458 const char *secretAccessKey, const char *hostName, 01459 S3RequestContext *requestContext, 01460 const S3ListServiceHandler *handler, 01461 void *callbackData); 01462 01463 01498 void S3_test_bucket(S3Protocol protocol, S3UriStyle uriStyle, 01499 const char *accessKeyId, const char *secretAccessKey, 01500 const char *hostName, const char *bucketName, 01501 int locationConstraintReturnSize, 01502 char *locationConstraintReturn, 01503 S3RequestContext *requestContext, 01504 const S3ResponseHandler *handler, void *callbackData); 01505 01506 01529 void S3_create_bucket(S3Protocol protocol, const char *accessKeyId, 01530 const char *secretAccessKey, const char *hostName, 01531 const char *bucketName, S3CannedAcl cannedAcl, 01532 const char *locationConstraint, 01533 S3RequestContext *requestContext, 01534 const S3ResponseHandler *handler, void *callbackData); 01535 01536 01558 void S3_delete_bucket(S3Protocol protocol, S3UriStyle uriStyle, 01559 const char *accessKeyId, const char *secretAccessKey, 01560 const char *hostName, const char *bucketName, 01561 S3RequestContext *requestContext, 01562 const S3ResponseHandler *handler, void *callbackData); 01563 01564 01585 void S3_list_bucket(const S3BucketContext *bucketContext, 01586 const char *prefix, const char *marker, 01587 const char *delimiter, int maxkeys, 01588 S3RequestContext *requestContext, 01589 const S3ListBucketHandler *handler, void *callbackData); 01590 01591 01616 void S3_put_object(const S3BucketContext *bucketContext, const char *key, 01617 uint64_t contentLength, 01618 const S3PutProperties *putProperties, 01619 S3RequestContext *requestContext, 01620 const S3PutObjectHandler *handler, void *callbackData); 01621 01622 01657 void S3_copy_object(const S3BucketContext *bucketContext, 01658 const char *key, const char *destinationBucket, 01659 const char *destinationKey, 01660 const S3PutProperties *putProperties, 01661 int64_t *lastModifiedReturn, int eTagReturnSize, 01662 char *eTagReturn, S3RequestContext *requestContext, 01663 const S3ResponseHandler *handler, void *callbackData); 01664 01665 01687 void S3_get_object(const S3BucketContext *bucketContext, const char *key, 01688 const S3GetConditions *getConditions, 01689 uint64_t startByte, uint64_t byteCount, 01690 S3RequestContext *requestContext, 01691 const S3GetObjectHandler *handler, void *callbackData); 01692 01693 01708 void S3_head_object(const S3BucketContext *bucketContext, const char *key, 01709 S3RequestContext *requestContext, 01710 const S3ResponseHandler *handler, void *callbackData); 01711 01726 void S3_delete_object(const S3BucketContext *bucketContext, const char *key, 01727 S3RequestContext *requestContext, 01728 const S3ResponseHandler *handler, void *callbackData); 01729 01730 01761 void S3_get_acl(const S3BucketContext *bucketContext, const char *key, 01762 char *ownerId, char *ownerDisplayName, 01763 int *aclGrantCountReturn, S3AclGrant *aclGrants, 01764 S3RequestContext *requestContext, 01765 const S3ResponseHandler *handler, void *callbackData); 01766 01767 01793 void S3_set_acl(const S3BucketContext *bucketContext, const char *key, 01794 const char *ownerId, const char *ownerDisplayName, 01795 int aclGrantCount, const S3AclGrant *aclGrants, 01796 S3RequestContext *requestContext, 01797 const S3ResponseHandler *handler, void *callbackData); 01798 01799 01840 void S3_get_server_access_logging(const S3BucketContext *bucketContext, 01841 char *targetBucketReturn, 01842 char *targetPrefixReturn, 01843 int *aclGrantCountReturn, 01844 S3AclGrant *aclGrants, 01845 S3RequestContext *requestContext, 01846 const S3ResponseHandler *handler, 01847 void *callbackData); 01848 01849 01879 void S3_set_server_access_logging(const S3BucketContext *bucketContext, 01880 const char *targetBucket, 01881 const char *targetPrefix, int aclGrantCount, 01882 const S3AclGrant *aclGrants, 01883 S3RequestContext *requestContext, 01884 const S3ResponseHandler *handler, 01885 void *callbackData); 01886 01887 01888 #ifdef __cplusplus 01889 } 01890 #endif 01891 01892 #endif /* LIBS3_H */