diff --git a/CMakeCPack.cmake b/CMakeCPack.cmake index 68cb351..75d1f33 100644 --- a/CMakeCPack.cmake +++ b/CMakeCPack.cmake @@ -16,12 +16,12 @@ SET(CPACK_PACKAGE_VERSION_MAJOR ${LIBAWS_MAJOR_VERSION}) SET(CPACK_PACKAGE_VERSION_MINOR ${LIBAWS_MINOR_VERSION}) SET(CPACK_PACKAGE_VERSION_PATCH ${LIBAWS_PATCH_VERSION}) -SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.txt") +SET(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.txt") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "libaws - A Amazon Web Services C++ Library") SET(CPACK_PACKAGE_EXECUTABLES "s3") SET(CPACK_PACKAGE_NAME "libaws") SET(CPACK_PACKAGE_CONTACT "matthias.brantner@28msec.com") -SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.txt") +SET(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.txt") SET(CPACK_PACKAGE_VENDOR "28msec, Inc.") SET(CPACK_PACKAGE_VERSION "${LIBAWS_MAJOR_VERSION}.${LIBAWS_MINOR_VERSION}.${LIBAWS_PATCH_VERSION}") SET(CPACK_PACKAGE_FILE_NAME "libaws-${LIBAWS_MAJOR_VERSION}.${LIBAWS_MINOR_VERSION}.${LIBAWS_PATCH_VERSION}") @@ -30,7 +30,7 @@ SET(CPACK_PACKAGE_VERSION_MINOR "${CPACK_PACKAGE_VERSION_MINOR}") SET(CPACK_PACKAGE_VERSION_PATCH "${CPACK_PACKAGE_VERSION_PATCH}") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "libaws ${LIBAWS_MAJOR_VERSION}.${LIBAWS_MINOR_VERSION}") SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "libaws ${CPACK_PACKAGE_VERSION}") -SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") +SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt") SET(CPACK_DEBIAN_PACKAGE_NAME "libaws") SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libcurl3-dev, libcurl4-openssl-dev, libxml2-dev") diff --git a/CMakeLists.txt b/CMakeLists.txt index 2843873..c847a32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/CMakeUninstall.cmake") # configure the cmake script to create a source package -CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/CPackSourceConfig.cmake.in +CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/CPackSourceConfig.cmake.in ${CMAKE_BINARY_DIR}/CPackSourceConfig.cmake) MESSAGE(STATUS "configured ${CMAKE_SOURCE_DIR}/CPackSourceConfig.cmake.in --> ${CMAKE_BINARY_DIR}/CPackSourceConfig.cmake") @@ -135,6 +135,6 @@ INCLUDE(CMakeExportBuildSettings) CMAKE_EXPORT_BUILD_SETTINGS(${CMAKE_BINARY_DIR}/LIBAWSBuildSettings.cmake) EXPORT_LIBRARY_DEPENDENCIES(${CMAKE_BINARY_DIR}/LIBAWSDepends.cmake) -CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/LIBAWSConfig.cmake.in ${CMAKE_BINARY_DIR}/LIBAWSConfig.cmake) +CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/LIBAWSConfig.cmake.in ${CMAKE_BINARY_DIR}/LIBAWSConfig.cmake) INCLUDE(CMakeCPack.cmake) diff --git a/bin/s3.cpp b/bin/s3.cpp index 8138754..f8fb891 100644 --- a/bin/s3.cpp +++ b/bin/s3.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include using namespace aws; diff --git a/bin/sdb.cpp b/bin/sdb.cpp index 34c6977..f8dc174 100644 --- a/bin/sdb.cpp +++ b/bin/sdb.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include using namespace aws; diff --git a/bin/sqs.cpp b/bin/sqs.cpp index 2a11237..0ab8e50 100644 --- a/bin/sqs.cpp +++ b/bin/sqs.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include using namespace aws; diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index cf917e7..cadba1c 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -INCLUDE(${CMAKE_SOURCE_DIR}/cmake_modules/CMakeUseDoxygen.cmake) +INCLUDE(${PROJECT_SOURCE_DIR}/cmake_modules/CMakeUseDoxygen.cmake) #install the documentation IF(DOXYGEN_FOUND) diff --git a/fuse/s3fs.cpp b/fuse/s3fs.cpp index d9138fb..293bfe9 100644 --- a/fuse/s3fs.cpp +++ b/fuse/s3fs.cpp @@ -56,6 +56,7 @@ #include #include #include +#include #include #include "properties.h" diff --git a/include/libaws/common.h b/include/libaws/common.h index 027f126..a3a21d4 100644 --- a/include/libaws/common.h +++ b/include/libaws/common.h @@ -105,6 +105,9 @@ namespace aws { class DeleteMessageResponse; typedef SmartPtr DeleteMessageResponsePtr; + class GetQueueAttributesResponse; + typedef SmartPtr GetQueueAttributesResponsePtr; + /** * SDB stuff */ diff --git a/include/libaws/sqsconnection.h b/include/libaws/sqsconnection.h index 8c24c66..714672e 100644 --- a/include/libaws/sqsconnection.h +++ b/include/libaws/sqsconnection.h @@ -49,6 +49,9 @@ namespace aws { virtual DeleteMessageResponsePtr deleteMessage(const std::string &aQueueUrl, const std::string &aReceiptHandle) = 0; + + virtual GetQueueAttributesResponsePtr + getQueueAttributes( const std::string &aQueueUrl ) = 0; }; /* class SQSConnection */ diff --git a/include/libaws/sqsexception.h b/include/libaws/sqsexception.h index 752f1f5..8daa8e9 100644 --- a/include/libaws/sqsexception.h +++ b/include/libaws/sqsexception.h @@ -129,6 +129,15 @@ namespace aws { CreateQueueException(const QueryErrorResponse&); }; + class GetQueueAttributesException : public SQSException + { + public: + virtual ~GetQueueAttributesException() throw(); + private: + friend class sqs::SQSConnection; + GetQueueAttributesException(const QueryErrorResponse&); + }; + class DeleteQueueException : public SQSException { public: diff --git a/include/libaws/sqsresponse.h b/include/libaws/sqsresponse.h index c47bfee..560e637 100644 --- a/include/libaws/sqsresponse.h +++ b/include/libaws/sqsresponse.h @@ -31,6 +31,7 @@ namespace aws { class SendMessageResponse; class ReceiveMessageResponse; class DeleteMessageResponse; + class GetQueueAttributesResponse; } /* namespace sqs */ template @@ -109,6 +110,21 @@ namespace aws { SendMessageResponse(sqs::SendMessageResponse*); }; + + class GetQueueAttributesResponse : public SQSResponse + { + public: + ~GetQueueAttributesResponse() {} + int getNumberOfMessages(); + int getNumberOfNotVisibleMessages(); + time_t getLastModifiedTime(); + time_t getCreateTime(); + int getMessageRetentionPeriod(); + + protected: + friend class SQSConnectionImpl; + GetQueueAttributesResponse(sqs::GetQueueAttributesResponse*); + }; class ReceiveMessageResponse : public SQSResponse { @@ -123,6 +139,7 @@ namespace aws { std::string message_id; uint64_t meta_data; std::string receipt_handle; + uint64_t approximate_count; }; void diff --git a/src/api/connectionpool.cpp b/src/api/connectionpool.cpp index 8fd0176..6fb267c 100644 --- a/src/api/connectionpool.cpp +++ b/src/api/connectionpool.cpp @@ -25,7 +25,7 @@ namespace aws { theSize(size) { for(unsigned int i=1;i<=size;i++){ - push(createConnection(theAccessKeyId, theSecretAccessKey)); + std::queue::push(createConnection(theAccessKeyId, theSecretAccessKey)); } } diff --git a/src/api/sqsconnectionimpl.cpp b/src/api/sqsconnectionimpl.cpp index b46b8a5..1bbbe0b 100644 --- a/src/api/sqsconnectionimpl.cpp +++ b/src/api/sqsconnectionimpl.cpp @@ -65,6 +65,12 @@ namespace aws { return new DeleteMessageResponse(theConnection->deleteMessage(aQueueUrl, aReceiptHandle)); } + GetQueueAttributesResponsePtr + SQSConnectionImpl::getQueueAttributes(const std::string& aQueueUrl) + { + return new GetQueueAttributesResponse(theConnection->getQueueAttributes(aQueueUrl)); + } + SQSConnectionImpl::SQSConnectionImpl(const std::string& aAccessKeyId, const std::string& aSecretAccessKey, const std::string& aCustomHost) diff --git a/src/api/sqsconnectionimpl.h b/src/api/sqsconnectionimpl.h index 45d4be1..970a48f 100644 --- a/src/api/sqsconnectionimpl.h +++ b/src/api/sqsconnectionimpl.h @@ -53,6 +53,9 @@ namespace aws { virtual DeleteMessageResponsePtr deleteMessage(const std::string &aQueueUrl, const std::string &aReceiptHandle); + virtual GetQueueAttributesResponsePtr + getQueueAttributes( const std::string &aQueueUrl ); + protected: // only the factory can create us friend class AWSConnectionFactoryImpl; diff --git a/src/api/sqsresponse.cpp b/src/api/sqsresponse.cpp index 06c51ef..d1a9d86 100644 --- a/src/api/sqsresponse.cpp +++ b/src/api/sqsresponse.cpp @@ -67,6 +67,38 @@ namespace aws { DeleteQueueResponse::DeleteQueueResponse(sqs::DeleteQueueResponse* r) : SQSResponse(r) {} + GetQueueAttributesResponse::GetQueueAttributesResponse(sqs::GetQueueAttributesResponse* r) + : SQSResponse(r) {} + + int + GetQueueAttributesResponse::getNumberOfMessages() + { + return theSQSResponse->getNumberOfMessages(); + } + + int + GetQueueAttributesResponse::getNumberOfNotVisibleMessages() + { + return theSQSResponse->getNumberOfNotVisibleMessages(); + } + + time_t + GetQueueAttributesResponse::getLastModifiedTime() + { + return theSQSResponse->getLastModifiedTime(); + } + + time_t + GetQueueAttributesResponse::getCreateTime() + { + return theSQSResponse->getCreateTime(); + } + int + GetQueueAttributesResponse::getMessageRetentionPeriod() + { + return theSQSResponse->getMessageRetentionPeriod(); + } + /** * ListQueuesResponse */ diff --git a/src/awsqueryconnection.cpp b/src/awsqueryconnection.cpp index 093ef44..f097295 100644 --- a/src/awsqueryconnection.cpp +++ b/src/awsqueryconnection.cpp @@ -153,11 +153,8 @@ namespace aws { // can possibly be removed with a newer curl version // because it will always copy std::string lUrlString = lUrl.str(); - LOG_INFO("Send request:" << lUrlString); - - //std::cout << lUrlString << std::endl; // set the request url curl_easy_setopt ( theCurl, CURLOPT_URL, lUrlString.c_str() ); diff --git a/src/s3/s3handler.cpp b/src/s3/s3handler.cpp index 6738aa3..7b8ecc2 100644 --- a/src/s3/s3handler.cpp +++ b/src/s3/s3handler.cpp @@ -432,7 +432,7 @@ ListBucketHandler::charactersSAXFunc(void * ctx, #endif #ifndef NDEBUG - assert(lEndValue=='\0'); + assert(**lEndValue=='\0'); #endif } else if (lHandler->isSet(CommonPrefixes) && lHandler->isSet(Prefix)) { lRes->theCommonPrefixes.push_back(std::string((const char*)value, len)); diff --git a/src/sqs/sqsconnection.cpp b/src/sqs/sqsconnection.cpp index 4c23646..c71fab6 100644 --- a/src/sqs/sqsconnection.cpp +++ b/src/sqs/sqsconnection.cpp @@ -152,7 +152,8 @@ namespace aws { namespace sqs { s << aVisibilityTimeout; lMap.insert (ParameterPair ("VisibilityTimeout", s.str())); } - + lMap.insert (ParameterPair ("AttributeName", "All")); + lMap.insert (ParameterPair ("Version", "2009-02-01")); return receiveMessage (aQueueUrl, lMap, aDecode); } @@ -170,6 +171,22 @@ namespace aws { namespace sqs { } } + GetQueueAttributesResponse* + SQSConnection::getQueueAttributes(const std::string& aQueueUrl) + { + ParameterMap lMap; + lMap.insert( ParameterPair ("AttributeName.1", "All")); + lMap.insert( ParameterPair ("Version", "2012-11-05")); + GetQueueAttributesHandler lHandler; + makeQueryRequest(aQueueUrl, "GetQueueAttributes", &lMap, &lHandler); + if (lHandler.isSuccessful()) { + setCommons(lHandler, lHandler.theGetQueueAttributesResponse); + return lHandler.theGetQueueAttributesResponse; + } else { + throw GetQueueAttributesException (lHandler.getQueryErrorResponse()); + } + } + DeleteMessageResponse* SQSConnection::deleteMessage(const std::string &aQueueUrl, const std::string &aReceiptHandle) { diff --git a/src/sqs/sqsconnection.h b/src/sqs/sqsconnection.h index 5ab94c7..5fa4183 100644 --- a/src/sqs/sqsconnection.h +++ b/src/sqs/sqsconnection.h @@ -33,6 +33,7 @@ namespace aws { class SendMessageResponse; class ReceiveMessageResponse; class DeleteMessageResponse; + class GetQueueAttributesResponse; class SQSConnection : public AWSQueryConnection { @@ -51,6 +52,9 @@ namespace aws { int aPort, bool aIsSecure); + virtual GetQueueAttributesResponse* + getQueueAttributes( const std::string &aQueueUrl ); + virtual CreateQueueResponse* createQueue ( const std::string &aQueueName, int aDefaultVisibilityTimeout ); diff --git a/src/sqs/sqsexception.cpp b/src/sqs/sqsexception.cpp index 73631ca..de92c5f 100644 --- a/src/sqs/sqsexception.cpp +++ b/src/sqs/sqsexception.cpp @@ -54,6 +54,11 @@ namespace aws { CreateQueueException::~CreateQueueException() throw() {} + GetQueueAttributesException::GetQueueAttributesException (const QueryErrorResponse& aError) + : SQSException (aError) {} + + GetQueueAttributesException::~GetQueueAttributesException() throw() {} + ListQueuesException::ListQueuesException (const QueryErrorResponse& aError) : SQSException (aError) {} diff --git a/src/sqs/sqshandler.cpp b/src/sqs/sqshandler.cpp index 15316e6..984cb6f 100644 --- a/src/sqs/sqshandler.cpp +++ b/src/sqs/sqshandler.cpp @@ -190,10 +190,10 @@ namespace aws { ReceiveMessageHandler::responseStartElement ( const xmlChar * localname, int nb_attributes, const xmlChar ** attributes ) { if ( xmlStrEqual ( localname, BAD_CAST "ReceiveMessageResponse" ) ) { - theReceiveMessageResponse = new ReceiveMessageResponse(); + theReceiveMessageResponse = new ReceiveMessageResponse(); } else if ( xmlStrEqual ( localname, BAD_CAST "Message" ) ) { - ReceiveMessageResponse::Message lMessage; - theReceiveMessageResponse->theMessages.push_back(lMessage); + ReceiveMessageResponse::Message lMessage; + theReceiveMessageResponse->theMessages.push_back(lMessage); } else if ( xmlStrEqual ( localname, BAD_CAST "MessageId" ) ) { setState ( MessageId ); } else if ( xmlStrEqual ( localname, BAD_CAST "ReceiptHandle" ) ) { @@ -202,26 +202,36 @@ namespace aws { setState ( MD5OfMessageBody ); } else if ( xmlStrEqual ( localname, BAD_CAST "Body" ) ) { setState ( Body ); - }else if ( xmlStrEqual ( localname, BAD_CAST "MetaData" ) ) { + } else if ( xmlStrEqual ( localname, BAD_CAST "MetaData" ) ) { setState ( MetaData ); + } else if ( xmlStrEqual ( localname, BAD_CAST "Attribute" ) ) { + setState ( Attribute ); + } else if ( xmlStrEqual ( localname, BAD_CAST "Name" ) ) { // magiczhao add + if ( isSet ( Attribute ) ) { + setState ( AttributeName ); + } + } else if ( xmlStrEqual ( localname, BAD_CAST "Value" ) ) { + if ( isSet ( Attribute ) ) { + setState ( AttributeValue ); + } } } void ReceiveMessageHandler::responseCharacters ( const xmlChar * value, int len ) { - if ( isSet ( MessageId ) ) { - ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); - std::string lMessageId((const char*)value, len); - lMessage.message_id = lMessageId; - } else if ( isSet ( ReceiptHandle )) { - ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); - std::string lReceiptHandle((const char*)value, len); - lMessage.receipt_handle = lReceiptHandle; - } else if ( isSet ( MD5OfMessageBody )) { - ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); - std::string lMessageMD5((const char*)value, len); - lMessage.message_md5 = lMessageMD5; + if ( isSet ( MessageId ) ) { + ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); + std::string lMessageId((const char*)value, len); + lMessage.message_id = lMessageId; + } else if ( isSet ( ReceiptHandle )) { + ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); + std::string lReceiptHandle((const char*)value, len); + lMessage.receipt_handle = lReceiptHandle; + } else if ( isSet ( MD5OfMessageBody )) { + ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); + std::string lMessageMD5((const char*)value, len); + lMessage.message_md5 = lMessageMD5; } else if ( isSet ( MetaData )) { ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); std::string lMetaDataStr((const char*)value, len); @@ -230,22 +240,34 @@ namespace aws { lMessage.meta_data = lMetaData; } else if ( isSet ( Body )) { theBody.append( (const char*)value, len ); - } + } else if ( isSet ( AttributeName )) { // magiczhao add + currentAttributeName.assign ((const char*)value, len); + } else if ( isSet ( AttributeValue )) { + if ( currentAttributeName == "ApproximateReceiveCount" ) { + ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); + char* buffer = new char[len + 1]; + strncpy (buffer, (const char*)value, len); + buffer[len] = '\0'; + lMessage.approximate_count = atoi(buffer); + delete [] buffer; + } + } + } void ReceiveMessageHandler::responseEndElement ( const xmlChar * localname ) { if ( xmlStrEqual ( localname, BAD_CAST "MessageId" ) ) { - unsetState ( MessageId ); + unsetState ( MessageId ); } else if ( xmlStrEqual ( localname, BAD_CAST "ReceiptHandle" ) ) { - unsetState ( ReceiptHandle ); + unsetState ( ReceiptHandle ); } else if ( xmlStrEqual ( localname, BAD_CAST "MD5OfBody" ) ) { - unsetState ( MD5OfMessageBody ); + unsetState ( MD5OfMessageBody ); } else if ( xmlStrEqual ( localname, BAD_CAST "MetaData" ) ) { unsetState ( MetaData ); }else if ( xmlStrEqual ( localname, BAD_CAST "Body" ) ) { - unsetState ( Body ); + unsetState ( Body ); ReceiveMessageResponse::Message& lMessage = theReceiveMessageResponse->theMessages.back(); if (theDecode) { lMessage.message_body = AWSConnection::base64Decode(theBody.c_str(), theBody.size(), lMessage.message_size); @@ -255,10 +277,17 @@ namespace aws { lMessage.message_body = lBody; lMessage.message_size = theBody.size(); } - //std::cout << std::endl << "ID" << lMessage.message_id << "Original[" << theBody << "]" << std::endl; - //std::cout << std::endl << "ID" << lMessage.message_id << "Encoded[" << lMessage.message_body << "]" << std::endl; - //std::cout << std::endl << "UNSET BODY " << "ID" << lMessage.message_id << std::endl; theBody.clear(); + } else if ( xmlStrEqual ( localname, BAD_CAST "Name" ) ) { // magiczhao add + if ( isSet ( AttributeName ) ) { + setState ( Attribute ); + } + } else if ( xmlStrEqual ( localname, BAD_CAST "Value" ) ) { + if ( isSet ( AttributeValue ) ) { + setState ( Attribute ); + } + } else if ( xmlStrEqual ( localname, BAD_CAST "Attribute" ) ) { + unsetState ( Attribute ); } } @@ -280,5 +309,56 @@ namespace aws { { } + void + GetQueueAttributesHandler::responseStartElement ( const xmlChar* localname, int nb_attributes, const xmlChar** attributes ) + { + if ( xmlStrEqual ( localname, BAD_CAST "GetQueueAttributesResponse" )) { + theGetQueueAttributesResponse = new GetQueueAttributesResponse(); + } else if ( xmlStrEqual ( localname, BAD_CAST "Attribute" )) { + setState ( Attribute ); + } else if ( xmlStrEqual ( localname, BAD_CAST "Name")) { + setState ( AttributeName ); + } else if ( xmlStrEqual ( localname, BAD_CAST "Value")) { + setState ( AttributeValue ); + } + } + + void + GetQueueAttributesHandler::responseCharacters ( const xmlChar* value, int len ) + { + if ( isSet( AttributeName ) ) { + currAttributeName.assign((const char*)value, len); + } else if ( isSet( AttributeValue ) ) { + if (currAttributeName == "ApproximateNumberOfMessages") { + std::string value_str((const char*)value, len); + theGetQueueAttributesResponse->approximateNumberOfMessages = atoi(value_str.c_str()); + } else if (currAttributeName == "ApproximateNumberOfMessagesNotVisible") { + std::string value_str((const char*)value, len); + theGetQueueAttributesResponse->approximateNumberOfMessagesNotVisible = + atoi(value_str.c_str()); + } else if (currAttributeName == "CreatedTimestamp") { + std::string value_str((const char*)value, len); + theGetQueueAttributesResponse->createTime = atoi(value_str.c_str()); + } else if (currAttributeName == "LastModifiedTimestamp") { + std::string value_str((const char*)value, len); + theGetQueueAttributesResponse->lastModifiedTime = atoi(value_str.c_str()); + } else if (currAttributeName == "MessageRetentionPeriod") { + std::string value_str((const char*)value, len); + theGetQueueAttributesResponse->messageRetentionPeriod = atoi(value_str.c_str()); + } + } + } + + void + GetQueueAttributesHandler::responseEndElement ( const xmlChar* localname ) + { + if ( xmlStrEqual ( localname, BAD_CAST "Name" )) { + unsetState ( AttributeName ); + } else if ( xmlStrEqual (localname, BAD_CAST "Value" )) { + unsetState ( AttributeValue ); + } else if ( xmlStrEqual (localname, BAD_CAST "Attribute")) { + unsetState( Attribute ); + } + } } /* namespace sqs */ } /* namespace aws */ diff --git a/src/sqs/sqshandler.h b/src/sqs/sqshandler.h index 60e376d..2464b3a 100644 --- a/src/sqs/sqshandler.h +++ b/src/sqs/sqshandler.h @@ -27,6 +27,7 @@ namespace aws { class SendMessageResponse; class ReceiveMessageResponse; class DeleteMessageResponse; + class GetQueueAttributesResponse; class QueueErrorHandler : public SimpleQueryCallBack{ @@ -42,7 +43,10 @@ namespace aws { MD5OfMessageBody = 64, ReceiptHandle = 128, Body = 256, - MetaData = 512 + MetaData = 512, + Attribute = 1024, // magiczhao add + AttributeName = 2048, // magiczhao add + AttributeValue = 4096 // magiczhao add }; virtual void startElement ( const xmlChar * localname, int nb_attributes, const xmlChar ** attributes ); @@ -67,6 +71,19 @@ namespace aws { virtual void responseEndElement ( const xmlChar * localname ); }; + + class GetQueueAttributesHandler: public QueueErrorHandler + { + protected: + friend class SQSConnection; + GetQueueAttributesResponse* theGetQueueAttributesResponse; + std::string currAttributeName; + + public: + virtual void responseStartElement ( const xmlChar * localname, int nb_attributes, const xmlChar ** attributes ); + virtual void responseCharacters ( const xmlChar * value, int len ); + virtual void responseEndElement ( const xmlChar * localname ); + }; class DeleteQueueHandler : public QueueErrorHandler { @@ -112,6 +129,7 @@ namespace aws { private: std::string theBody; bool theDecode; + std::string currentAttributeName; protected: friend class SQSConnection; ReceiveMessageResponse* theReceiveMessageResponse; diff --git a/src/sqs/sqsresponse.h b/src/sqs/sqsresponse.h index 0f8955c..98e931a 100644 --- a/src/sqs/sqsresponse.h +++ b/src/sqs/sqsresponse.h @@ -72,11 +72,33 @@ namespace aws { getMD5OfMessageBody() const; protected: - friend class SendMessageHandler;; + friend class SendMessageHandler; std::string theMessageId; std::string theMD5OfMessageBody; }; + class GetQueueAttributesResponse : public QueryResponse + { + public: + GetQueueAttributesResponse() : approximateNumberOfMessages(0), + approximateNumberOfMessagesNotVisible(0) + {} + + int getNumberOfMessages() {return approximateNumberOfMessages;} + int getNumberOfNotVisibleMessages() {return approximateNumberOfMessagesNotVisible;} + time_t getLastModifiedTime() {return lastModifiedTime;} + time_t getCreateTime() {return createTime;} + int getMessageRetentionPeriod() {return messageRetentionPeriod;} + + protected: + friend class GetQueueAttributesHandler; + int approximateNumberOfMessages; + int approximateNumberOfMessagesNotVisible; + time_t lastModifiedTime; + time_t createTime; + int messageRetentionPeriod; + }; + class ReceiveMessageResponse : public QueryResponse { public: @@ -88,6 +110,7 @@ namespace aws { std::string message_id; uint64_t meta_data; std::string receipt_handle; + uint64_t approximate_count; }; ~ReceiveMessageResponse();