libs3  trunk
libs3.h
Go to the documentation of this file.
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 */