⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sgxawsparser.cpp

📁 一个基于BREW上的WEB service程序,通过扫描图书的条形码,登陆WEB站点,利用SOAP-RPC来查询图书信息.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**
***     Class Name                     : SGXAWSParser
***     Version                        : 1.0.0
***
***     Author                         : Sophia Cradle Incorporated
***     Platform                       : x86, ARM
***     OS                             : BREW 2.1, BREW 3.1
***     Target SophiaFramework Version : 3.0.6
***     Compiler                       : Visual C++ 6.0, Visual C++ .NET 2003,
***                                      RVCTB 1.2
**/

#include "SGXAWSParser.hpp"

// 偙偙偵Amazon 偺ID 傪愝掕偟偰偔偩偝偄
#define AMAZON_ID ""

#define AMAZON_URL_PREFIX "http://webservices.amazon.co.jp/onca/xml" \
                          "?Service=AWSECommerceService&Operation=ItemSearch" \
                          "&SubscriptionId=" AMAZON_ID "&SearchIndex=Books" \
                          "&ResponseGroup=Large" \
                          "&Power=isbn:"

#define AMAZON_URL_POSTFIX ""

SGXAWSParser::SGXAWSParser(Void) : _isParseItemAttributes(true),
    _isParseImageUrl(false), _isParseOfferSummary(false),
    _isParseOffers(false), _isParseCustomerReviews(false),
    _isParseSimilarProducts(false), _isParseBrowserNodes(false),
    _isParseListmaniaLists(false),
    _itemAttributes(null), _imageUrl(null), _offerSummary(null), _offers(null),
    _customerReviews(null), _similarProducts(null), _browserNodes(null),
    _listmaniaLists(null)
{
    return;
}

SGXAWSParser::~SGXAWSParser(Void)
{
    Clear();
    return;
}

SFXAnsiString SGXAWSParser::GetUrl(SFXAnsiStringConstRef isbn)
{
    return AMAZON_URL_PREFIX + isbn + AMAZON_URL_POSTFIX;
}

Void SGXAWSParser::Clear(Void)
{
    _title.Clear();
    _asin.Clear();

    delete _itemAttributes;
    _itemAttributes = null;
    delete _imageUrl;
    _imageUrl = null;
    delete _offerSummary;
    _offerSummary = null;
    if (_offers != null) {
        SFXArray<OfferRecPtr>::Enumerator enumerator = _offers->offers.GetEnumerator();
        while (enumerator.HasNext()) {
            OfferRecPtr offer(enumerator.GetNext());
            delete offer;
        }
        _offers->offers.Clear();
        delete _offers;
        _offers = null;
    }
    
    if (_customerReviews != null) {
        SFXArray<ReviewRecPtr>::Enumerator enumerator = _customerReviews->reviews.GetEnumerator();
        while (enumerator.HasNext()) {
            ReviewRecPtr review(enumerator.GetNext());
            delete review;
        }
        _customerReviews->reviews.Clear();
        delete _customerReviews;
        _customerReviews = null;
    }

    if (_similarProducts != null) {
        SFXArray<SimilarProductRecPtr>::Enumerator enumerator = _similarProducts->similarProducts.GetEnumerator();
        while (enumerator.HasNext()) {
            SimilarProductRecPtr similarProduct(enumerator.GetNext());
            delete similarProduct;
        }
        _similarProducts->similarProducts.Clear();
        delete _similarProducts;
        _similarProducts = null;
    }
}

SFXAnsiString DecodeHtml(SFXAnsiStringConstRef string)
{
    return string.Replace("&lt;", '<').Replace("&gt;", '>').Replace("&quot;", '"').Replace("&amp;", '&');
}

// filename 僼傽僀儖撪偺XML 傪夝愅偡傞
// 栠傝抣丗 SFERR_NO_ERROR 惉岟丄SFERR_FAILED 幐攕丄偦偺懠 XML 僷乕僒偺僄儔乕傪偦偺傑傑曉偡
SFCError SGXAWSParser::Parse(SFXAnsiStringConstRef filename)
{
    SFCError error;

    SFXXMLDOMParser parser;
    parser.SetDoNamespaces(false);

    Clear();

    SFXHelper::dbgprintf("[SGXAWSParser] [%s]", filename.GetCString());

    error = parser.Parse(filename); // XML 傪夝愅
    SFXHelper::dbgprintf("[SGXAWSParser.Parse] [%d]", error);
    if (error == SFERR_NO_ERROR) { // 夝愅惉岟
        SFXXMLDocument* root = parser.GetDocument(); // 儖乕僩傪庢摼
        if (root != null) {
            SFXXMLNodePtr child;

            // Item 僞僌傪扵偡
            SFXList<SFXXMLNodePtr>* list = root->GetElementsByTagName("Item");
            if (list != null && list->GetSize() > 0) {
                child = list->Get(0); // 崱夞偺応崌丄Item 僞僌偼 1 偮偟偐側偄偼偢
                for (child = child->GetFirstChild(); child != null && error == SFERR_NO_ERROR; child = child->GetNextSibling()) {
                    if (SFXAnsiString(child->GetNodeName()) == "ASIN") {
                        _asin = DecodeHtml(child->GetText());
                    } else if (SFXAnsiString(child->GetNodeName()) == "DetailPageURL") {
                        _detailPageURL = DecodeHtml(child->GetText());
                    } else if (SFXAnsiString(child->GetNodeName()) == "SalesRank") {
                        // SalesRank偵偼僇儞儅偑偮偄偰傞偺偱嶍彍
                        _salesRank = child->GetText().Replace(',', "").ToSInt32();
                    } else if (SFXAnsiString(child->GetNodeName()) == "ItemAttributes") {
                        if (_isParseItemAttributes) { // ItemAttributes 僞僌偺壓傪夝愅偡傞偐偳偆偐
                            error = ParseItemAttributes(child->GetFirstChild());
                        } else {// ItemAttributes 僞僌偺壓傪夝愅偟側偄側傜僞僀僩儖偺傒夝愅
                            error = ParseTitle(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "SmallImage") {
                        if (_isParseImageUrl) {
                            error = ParseSmallImage(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "MediumImage") {
                        if (_isParseImageUrl) {
                            error = ParseMediumImage(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "LargeImage") {
                        if (_isParseImageUrl) {
                            error = ParseLargeImage(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "OfferSummary") {
                        if (_isParseOfferSummary) {
                            error = ParseOfferSummary(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "Offers") {
                        if (_isParseOffers) {
                            error = ParseOffers(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "CustomerReviews") {
                        if (_isParseCustomerReviews) {
                            error = ParseCustomerReviews(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "SimilarProducts") {
                        if (_isParseSimilarProducts) {
                            error = ParseSimilarProducts(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "BrowseNodes") {
                        if (_isParseBrowserNodes) {
                            error = ParseBrowserNodes(child->GetFirstChild());
                        }
                    } else if (SFXAnsiString(child->GetNodeName()) == "ListmaniaLists") {
                        if (_isParseListmaniaLists) {
                            error = ParseListmaniaLists(child->GetFirstChild());
                        }
                    }
                }
            }
            else {
                error = SFERR_FAILED;
            }
        }
        else {
            error = SFERR_FAILED;
        }
    }
    SFXHelper::dbgprintf("[SGXAWSParser] ParseXML END %d", error);
    if (error != SFERR_NO_ERROR) {
        _title = "夝愅幐攕";
        SFXHelper::dbgprintf("[SGXAWSParser] ParseXML ERROR %d", error);
        SFXHelper::dbgprintf("[SGXAWSParser] [%s]", parser.GetErrorInfo());
    }
    SFXHelper::dbgprintf("[SGXAWSParser] ParseXML END %d", error);
    return error;
}

// 僿儖僷乕娭悢
SFXDate StringToDate(SFXAnsiStringConstRef string)
{
    SFXDate ret(0);

    // YYYY/MM/DD 宍幃偲 YYYY/MM 宍幃偑巊傢傟偰偄傞傛偆偱偡丅
    // YYYY/MM 宍幃偺帪偺僨乕僞偺埖偄曽偼枹寛掕丅
    if (string.GetLength() >= 10) {
        ret.SetDate(static_cast<SInt16>(string.Substring(0, 4).ToUInt32()),
                    static_cast<SInt16>(string.Substring(5, 7).ToUInt32()),
                    static_cast<SInt16>(string.Substring(8, 10).ToUInt32()));
    }
    else if (string.GetLength() >= 7) {
        ret.SetDate(static_cast<SInt16>(string.Substring(0, 4).ToUInt32()),
                    static_cast<SInt16>(string.Substring(5, 7).ToUInt32()), 1);
    }
    return ret;
}

// ItemAttributes 僞僌偺壓傪夝愅
SFCError SGXAWSParser::ParseItemAttributes(SFXXMLNodePtr node)
{
    SFCError error(SFERR_NO_ERROR);

    if (node != null) {
        _itemAttributes = new ItemAttributesRec;
        if (_itemAttributes != null) {
            _itemAttributes->numberOfPages = 0;
            _itemAttributes->packageDimensionsLength = 0;
            _itemAttributes->packageDimensionsWidth = 0;
            for (; node != null && error == SFERR_NO_ERROR; node = node->GetNextSibling()) {
                if (SFXAnsiString(node->GetNodeName()) == "Binding") {
                    _itemAttributes->binding = DecodeHtml(node->GetText());
                } else if (SFXAnsiString(node->GetNodeName()) == "Creator") {
                    if (node->HasAttributes()) {
                        error = _itemAttributes->creator.Append(
                                    DecodeHtml(node->GetAttributes()->Item(0)->GetText()),
                                    DecodeHtml(node->GetText())
                                );
                    }
                } else if (SFXAnsiString(node->GetNodeName()) == "ListPrice") {
                    SFXXMLNodePtr node2(node->GetFirstChild());
                    for (; node2 != null; node2 = node2->GetNextSibling()) {
                        if (SFXAnsiString(node2->GetNodeName()) == "Amount") {
                            _itemAttributes->amount = node2->GetText().ToSInt32();
                        } else if (SFXAnsiString(node2->GetNodeName()) == "CurrencyCode") {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -