1 /*
2  * Copyright 2009-2017 Alibaba Cloud All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 #include <alibabacloud/oss/model/ListObjectVersionsResult.h>
19 #include <external/tinyxml2/tinyxml2.h>
20 #include <alibabacloud/oss/model/Owner.h>
21 #include "utils/Utils.h"
22 using namespace AlibabaCloud::OSS;
23 using namespace tinyxml2;
24 
25 
ListObjectVersionsResult()26 ListObjectVersionsResult::ListObjectVersionsResult() :
27     OssResult(),
28     name_(),
29     prefix_(),
30     keyMarker_(),
31     nextKeyMarker_(),
32     versionIdMarker_(),
33     nextVersionIdMarker_(),
34     delimiter_(),
35     encodingType_(),
36     isTruncated_(false),
37     maxKeys_(),
38     commonPrefixes_(),
39     objectVersionSummarys_(),
40     deleteMarkerSummarys_()
41 {
42 }
43 
ListObjectVersionsResult(const std::string & result)44 ListObjectVersionsResult::ListObjectVersionsResult(const std::string& result):
45     ListObjectVersionsResult()
46 {
47     *this = result;
48 }
49 
ListObjectVersionsResult(const std::shared_ptr<std::iostream> & result)50 ListObjectVersionsResult::ListObjectVersionsResult(const std::shared_ptr<std::iostream>& result):
51     ListObjectVersionsResult()
52 {
53     std::istreambuf_iterator<char> isb(*result.get()), end;
54     std::string str(isb, end);
55     *this = str;
56 }
57 
operator =(const std::string & result)58 ListObjectVersionsResult& ListObjectVersionsResult::operator =(const std::string& result)
59 {
60     XMLDocument doc;
61     XMLError xml_err;
62     if ((xml_err = doc.Parse(result.c_str(), result.size())) == XML_SUCCESS) {
63         XMLElement* root =doc.RootElement();
64         if (root && !std::strncmp("ListVersionsResult", root->Name(), 18)) {
65             XMLElement *node;
66             node = root->FirstChildElement("Name");
67             if (node && node->GetText()) name_ = node->GetText();
68 
69             node = root->FirstChildElement("Prefix");
70             if (node && node->GetText()) prefix_ = node->GetText();
71 
72             node = root->FirstChildElement("KeyMarker");
73             if (node && node->GetText()) keyMarker_ = node->GetText();
74 
75             node = root->FirstChildElement("NextKeyMarker");
76             if (node && node->GetText()) nextKeyMarker_ = node->GetText();
77 
78             node = root->FirstChildElement("VersionIdMarker");
79             if (node && node->GetText()) versionIdMarker_ = node->GetText();
80 
81             node = root->FirstChildElement("NextVersionIdMarker");
82             if (node && node->GetText()) nextVersionIdMarker_ = node->GetText();
83 
84             node = root->FirstChildElement("Delimiter");
85             if (node && node->GetText()) delimiter_ = node->GetText();
86 
87             node = root->FirstChildElement("MaxKeys");
88             if (node && node->GetText()) maxKeys_ = atoi(node->GetText());
89 
90             node = root->FirstChildElement("IsTruncated");
91             if (node && node->GetText()) isTruncated_ = !std::strncmp("true", node->GetText(), 4);
92 
93             node = root->FirstChildElement("EncodingType");
94             if (node && node->GetText()) encodingType_ = node->GetText();
95 
96             //Detect encode type
97             bool useUrlDecode = !ToLower(encodingType_.c_str()).compare(0, 3, "url", 3);
98 
99             //CommonPrefixes
100             node = root->FirstChildElement("CommonPrefixes");
101             for (; node; node = node->NextSiblingElement("CommonPrefixes")) {
102                 XMLElement *prefix_node = node->FirstChildElement("Prefix");
103                 if (prefix_node && prefix_node->GetText()) commonPrefixes_.push_back(
104                     (useUrlDecode ? UrlDecode(prefix_node->GetText()) : prefix_node->GetText()));
105             }
106 
107             //Version
108             XMLElement *contents_node = root->FirstChildElement("Version");
109             for (; contents_node; contents_node = contents_node->NextSiblingElement("Version")) {
110                 ObjectVersionSummary content;
111                 node = contents_node->FirstChildElement("Key");
112                 if (node && node->GetText()) content.key_ = useUrlDecode ? UrlDecode(node->GetText()) : node->GetText();
113 
114                 node = contents_node->FirstChildElement("VersionId");
115                 if (node && node->GetText()) content.versionid_ = node->GetText();
116 
117                 node = contents_node->FirstChildElement("IsLatest");
118                 if (node && node->GetText()) content.isLatest_ = !std::strncmp("true", node->GetText(), 4);
119 
120                 node = contents_node->FirstChildElement("LastModified");
121                 if (node && node->GetText()) content.lastModified_ = node->GetText();
122 
123                 node = contents_node->FirstChildElement("ETag");
124                 if (node && node->GetText()) content.eTag_ = TrimQuotes(node->GetText());
125 
126                 node = contents_node->FirstChildElement("Size");
127                 if (node && node->GetText()) content.size_ = std::atoll(node->GetText());
128 
129                 node = contents_node->FirstChildElement("StorageClass");
130                 if (node && node->GetText()) content.storageClass_ = ToStorageClassType(node->GetText());
131 
132                 node = contents_node->FirstChildElement("Type");
133                 if (node && node->GetText()) content.type_ = node->GetText();
134 
135                 node = contents_node->FirstChildElement("Owner");
136                 std::string owner_ID, owner_DisplayName;
137                 if (node) {
138                     XMLElement *sub_node;
139                     sub_node = node->FirstChildElement("ID");
140                     if (sub_node && sub_node->GetText()) owner_ID = sub_node->GetText();
141 
142                     sub_node = node->FirstChildElement("DisplayName");
143                     if (sub_node && sub_node->GetText()) owner_DisplayName = sub_node->GetText();
144                 }
145 
146                 content.owner_ = Owner(owner_ID, owner_DisplayName);
147                 objectVersionSummarys_.push_back(content);
148             }
149 
150             //DeleteMarker
151             contents_node = root->FirstChildElement("DeleteMarker");
152             for (; contents_node; contents_node = contents_node->NextSiblingElement("DeleteMarker")) {
153                 DeleteMarkerSummary content;
154                 node = contents_node->FirstChildElement("Key");
155                 if (node && node->GetText()) content.key_ = useUrlDecode ? UrlDecode(node->GetText()) : node->GetText();
156 
157                 node = contents_node->FirstChildElement("VersionId");
158                 if (node && node->GetText()) content.versionid_ = node->GetText();
159 
160                 node = contents_node->FirstChildElement("IsLatest");
161                 if (node && node->GetText()) content.isLatest_ = !std::strncmp("true", node->GetText(), 4);
162 
163                 node = contents_node->FirstChildElement("LastModified");
164                 if (node && node->GetText()) content.lastModified_ = node->GetText();
165 
166                 node = contents_node->FirstChildElement("Owner");
167                 std::string owner_ID, owner_DisplayName;
168                 if (node) {
169                     XMLElement *sub_node;
170                     sub_node = node->FirstChildElement("ID");
171                     if (sub_node && sub_node->GetText()) owner_ID = sub_node->GetText();
172 
173                     sub_node = node->FirstChildElement("DisplayName");
174                     if (sub_node && sub_node->GetText()) owner_DisplayName = sub_node->GetText();
175                 }
176 
177                 content.owner_ = Owner(owner_ID, owner_DisplayName);
178                 deleteMarkerSummarys_.push_back(content);
179             }
180 
181             //EncodingType
182             if (useUrlDecode) {
183                 delimiter_     = UrlDecode(delimiter_);
184                 keyMarker_     = UrlDecode(keyMarker_);
185                 nextKeyMarker_ = UrlDecode(nextKeyMarker_);
186                 prefix_        = UrlDecode(prefix_);
187             }
188         }
189 
190         //TODO check the result and the parse flag;
191         parseDone_ = true;
192     }
193 
194     return *this;
195 }
196 
197