2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FWebJson_JsonWriterImpl.cpp
20 * @brief The file contains the definition of _JsonWriterImpl class.
22 * This file contains the definition of _JsonWriterImpl class.
25 #include <unique_ptr.h>
26 #include <FBaseByteBuffer.h>
27 #include <FBaseColIEnumeratorT.h>
28 #include <FBaseColIMapEnumeratorT.h>
29 #include <FBaseSysLog.h>
30 #include <FBaseString.h>
31 #include <FBaseUtilMath.h>
32 #include <FBaseUtilStringUtil.h>
34 #include <FWebJsonIJsonValue.h>
35 #include <FWebJsonJsonArray.h>
36 #include <FWebJsonJsonBool.h>
37 #include <FWebJsonJsonNull.h>
38 #include <FWebJsonJsonNumber.h>
39 #include <FWebJsonJsonObject.h>
40 #include <FWebJsonJsonString.h>
41 #include <FBase_StringConverter.h>
42 #include "FWebJson_JsonWriterImpl.h"
43 #include "FWebJson_JsonUtils.h"
47 using namespace Tizen::Base;
48 using namespace Tizen::Base::Collection;
49 using namespace Tizen::Base::Utility;
50 using namespace Tizen::Io;
53 namespace Tizen { namespace Web { namespace Json
57 static const char COMMA = ',';
58 static const char QUOTE = '\"';
59 static const char COLON = ':';
60 static const char OBJECT_BEGIN = '{';
61 static const char OBJECT_END = '}';
62 static const char ARRAY_BEGIN = '[';
63 static const char ARRAY_END = ']';
67 _JsonWriterImpl::Compose(const IJsonValue* pValue, String& filePath)
69 SysTryReturnResult(NID_WEB_JSON, pValue, E_INVALID_DATA, "There is no data in IJsonValue.");
75 r = ConvertIJsonToString(const_cast<IJsonValue*>(pValue), output);
76 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
78 SysLog(NID_WEB_JSON, "file path: [%ls]", filePath.GetPointer());
79 r = file.Construct(filePath, "w+");
80 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
82 r = file.Write(output);
83 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
90 _JsonWriterImpl::Compose(const IJsonValue* pValue, void* pBuffer, int bufferLength)
92 SysTryReturnResult(NID_WEB_JSON, pValue, E_INVALID_DATA, "Invalid Input parameter.");
93 SysTryReturnResult(NID_WEB_JSON, pBuffer && bufferLength >= 0, E_INVALID_ARG, "Invalid buffer parameter.");
96 result r = ConvertIJsonToString(const_cast<IJsonValue*>(pValue), output);
97 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
99 unique_ptr<char[]> pText(_StringConverter::CopyToCharArrayN(output));
101 SysTryReturn(NID_WEB_JSON, pText.get(), r, r, "[%s] Propagating.", GetErrorMessage(r));
103 int charCount = strlen(pText.get());
104 charCount = (charCount <= bufferLength) ? charCount : bufferLength;
105 SysLog(NID_WEB_JSON, "[%d] characters written to given buffer", charCount);
106 memcpy(pBuffer, pText.get(), charCount);
113 _JsonWriterImpl::Compose(const IJsonValue* pValue, ByteBuffer& buffer)
115 SysTryReturnResult(NID_WEB_JSON, pValue, E_INVALID_DATA, "Invalid Input parameter.");
118 result r = ConvertIJsonToString(const_cast<IJsonValue*>(pValue), output);
119 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
121 unique_ptr<ByteBuffer> pByteBuf(StringUtil::StringToUtf8N(output));
123 SysTryReturn(NID_WEB_JSON, pByteBuf.get(), r, r, "[%s] Propagating.", GetErrorMessage(r));
125 if (buffer.GetPointer())
127 int givenCapacity = buffer.GetCapacity();
128 int requiredCapacity = pByteBuf->GetCapacity();
130 if (givenCapacity < requiredCapacity)
132 r = buffer.ExpandCapacity(requiredCapacity);
133 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
138 r = buffer.CopyFrom(*pByteBuf);
139 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
145 r = buffer.Construct(*pByteBuf);
146 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
154 _JsonWriterImpl::ConvertIJsonToString(IJsonValue* pValue, String& outString)
156 SysTryReturnResult(NID_WEB_JSON, pValue, E_INVALID_ARG, "input JsonValue pointer is null");
158 result r = E_SUCCESS;
160 switch (pValue->GetType())
162 case JSON_TYPE_OBJECT:
164 outString.Append(OBJECT_BEGIN);
166 const String* pKey = null;
167 IJsonValue* pObjectValue = null;
168 JsonObject* pObject = static_cast<JsonObject*>(pValue);
170 unique_ptr<JsonMapEnumerator> pMapEnum(pObject->GetMapEnumeratorN());
172 SysTryReturn(NID_WEB_JSON, pMapEnum.get(), r, r, "[%s] Propagating.", GetErrorMessage(r));
174 int itemCount = pObject->GetCount();
176 while (pMapEnum->MoveNext() == E_SUCCESS)
178 r = pMapEnum->GetKey(pKey);
179 SysTryReturn(NID_WEB_JSON, pKey, r, r, "[%s]Propagating.", GetErrorMessage(r));
182 r = ToEscString(*pKey, escString);
183 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
185 outString.Append(QUOTE);
186 outString.Append(escString);
187 outString.Append(QUOTE);
189 r = pMapEnum->GetValue(pObjectValue);
190 SysTryReturn(NID_WEB_JSON, pObjectValue, r, r, "[%s] Propagating.", GetErrorMessage(r));
192 outString.Append(COLON);
193 r = ConvertIJsonToString(pObjectValue, outString);
194 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
198 outString.Append(COMMA);
201 outString.Append(OBJECT_END);
205 case JSON_TYPE_ARRAY:
207 outString.Append(ARRAY_BEGIN);
209 IJsonValue* pArrayValue = null;
210 JsonArray* pArray = static_cast<JsonArray*>(pValue);
211 int itemCount = pArray->GetCount() - 1;
213 for (int index = 0; index <= itemCount; index++)
215 r = pArray->GetAt(index, pArrayValue);
216 SysTryReturn(NID_WEB_JSON, pArrayValue, r, r, "[%s] Propagating.", GetErrorMessage(r));
218 r = ConvertIJsonToString(pArrayValue, outString);
219 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
221 if (index != itemCount)
223 outString.Append(COMMA);
227 outString.Append(ARRAY_END);
231 case JSON_TYPE_STRING:
234 r = ToEscString(*(static_cast<JsonString*>(pValue)), escString);
235 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
237 outString.Append(QUOTE);
238 outString.Append(escString);
239 outString.Append(QUOTE);
243 case JSON_TYPE_NUMBER:
246 double val1 = static_cast<JsonNumber*>(pValue)->ToDouble();
247 double val2 = Math::Floor(val1);
249 r = (Double::Compare(val1, val2) == 0) ? out.Format(15, L"%g", val1) : out.Format(15, L"%f", val1);
250 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
252 outString.Append(out);
257 outString.Append((static_cast<JsonBool*>(pValue))->ToString());
261 outString.Append((static_cast<JsonNull*>(pValue))->ToString());
265 SysLogException(NID_WEB_JSON, E_INVALID_DATA, "[E_INVALID_DATA] reached default of ConvertIJsonToString");
266 return E_INVALID_DATA;
274 _JsonWriterImpl::ToEscString(const String& unEscStr, String& escString)
276 const wchar_t* pUnEscBuf = unEscStr.GetPointer();
277 SysTryReturn(NID_WEB_JSON, pUnEscBuf, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
279 int length = unEscStr.GetLength();
281 for (int i = 0; i < length; i++)
283 switch (pUnEscBuf[i])
286 escString.Append(L"\\\\");
289 escString.Append(L"\\\"");
292 escString.Append(L"\\/");
295 escString.Append(L"\\b");
298 escString.Append(L"\\f");
301 escString.Append(L"\\n");
304 escString.Append(L"\\r");
307 escString.Append(L"\\t");
310 if (pUnEscBuf[i] < 0x80)
312 escString.Append(pUnEscBuf[i]);
317 uni.Format(7, L"\\u%04x", pUnEscBuf[i]);
318 escString.Append(uni);
328 }}} // Tizen::Web::Json