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));
100 SysTryReturn(NID_WEB_JSON, pText.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
102 int charCount = strlen(pText.get());
103 charCount = (charCount <= bufferLength) ? charCount : bufferLength;
104 SysLog(NID_WEB_JSON, "[%d] characters written to given buffer", charCount);
105 memcpy(pBuffer, pText.get(), charCount);
112 _JsonWriterImpl::Compose(const IJsonValue* pValue, ByteBuffer& buffer)
114 SysTryReturnResult(NID_WEB_JSON, pValue, E_INVALID_DATA, "Invalid Input parameter.");
117 result r = ConvertIJsonToString(const_cast<IJsonValue*>(pValue), output);
118 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
120 unique_ptr<ByteBuffer> pByteBuf(StringUtil::StringToUtf8N(output));
121 SysTryReturn(NID_WEB_JSON, pByteBuf.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
123 if (buffer.GetPointer())
125 int givenCapacity = buffer.GetCapacity();
126 int requiredCapacity = pByteBuf->GetCapacity();
128 if (givenCapacity < requiredCapacity)
130 r = buffer.ExpandCapacity(requiredCapacity);
131 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
136 r = buffer.CopyFrom(*pByteBuf);
137 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
143 r = buffer.Construct(*pByteBuf);
144 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
152 _JsonWriterImpl::ConvertIJsonToString(IJsonValue* pValue, String& outString)
154 SysTryReturnResult(NID_WEB_JSON, pValue, E_INVALID_ARG, "input JsonValue pointer is null");
156 result r = E_SUCCESS;
158 switch (pValue->GetType())
160 case JSON_TYPE_OBJECT:
162 outString.Append(OBJECT_BEGIN);
164 const String* pKey = null;
165 IJsonValue* pObjectValue = null;
166 JsonObject* pObject = static_cast<JsonObject*>(pValue);
168 unique_ptr<JsonMapEnumerator> pMapEnum(pObject->GetMapEnumeratorN());
169 SysTryReturn(NID_WEB_JSON, pMapEnum.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
171 int itemCount = pObject->GetCount();
173 while (pMapEnum->MoveNext() == E_SUCCESS)
175 r = pMapEnum->GetKey(pKey);
176 SysTryReturn(NID_WEB_JSON, pKey, r, r, "[%s]Propagating.", GetErrorMessage(r));
179 r = ToEscString(*pKey, escString);
180 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
182 outString.Append(QUOTE);
183 outString.Append(escString);
184 outString.Append(QUOTE);
186 r = pMapEnum->GetValue(pObjectValue);
187 SysTryReturn(NID_WEB_JSON, pObjectValue, r, r, "[%s] Propagating.", GetErrorMessage(r));
189 outString.Append(COLON);
190 r = ConvertIJsonToString(pObjectValue, outString);
191 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
195 outString.Append(COMMA);
198 outString.Append(OBJECT_END);
202 case JSON_TYPE_ARRAY:
204 outString.Append(ARRAY_BEGIN);
206 IJsonValue* pArrayValue = null;
207 JsonArray* pArray = static_cast<JsonArray*>(pValue);
208 int itemCount = pArray->GetCount() - 1;
210 for (int index = 0; index <= itemCount; index++)
212 r = pArray->GetAt(index, pArrayValue);
213 SysTryReturn(NID_WEB_JSON, pArrayValue, r, r, "[%s] Propagating.", GetErrorMessage(r));
215 r = ConvertIJsonToString(pArrayValue, outString);
216 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
218 if (index != itemCount)
220 outString.Append(COMMA);
224 outString.Append(ARRAY_END);
228 case JSON_TYPE_STRING:
231 r = ToEscString(*(static_cast<JsonString*>(pValue)), escString);
232 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
234 outString.Append(QUOTE);
235 outString.Append(escString);
236 outString.Append(QUOTE);
240 case JSON_TYPE_NUMBER:
243 double val1 = static_cast<JsonNumber*>(pValue)->ToDouble();
244 double val2 = Math::Floor(val1);
246 r = (Double::Compare(val1, val2) == 0) ? out.Format(15, L"%g", val1) : out.Format(15, L"%f", val1);
247 SysTryReturn(NID_WEB_JSON, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
249 outString.Append(out);
254 outString.Append((static_cast<JsonBool*>(pValue))->ToString());
258 outString.Append((static_cast<JsonNull*>(pValue))->ToString());
262 SysLogException(NID_WEB_JSON, E_INVALID_DATA, "[E_INVALID_DATA] reached default of ConvertIJsonToString");
263 return E_INVALID_DATA;
271 _JsonWriterImpl::ToEscString(const String& unEscStr, String& escString)
273 const wchar_t* pUnEscBuf = unEscStr.GetPointer();
274 SysTryReturn(NID_WEB_JSON, pUnEscBuf, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
276 int length = unEscStr.GetLength();
278 for (int i = 0; i < length; i++)
280 switch (pUnEscBuf[i])
283 escString.Append(L"\\\\");
286 escString.Append(L"\\\"");
289 escString.Append(L"\\/");
292 escString.Append(L"\\b");
295 escString.Append(L"\\f");
298 escString.Append(L"\\n");
301 escString.Append(L"\\r");
304 escString.Append(L"\\t");
307 if (pUnEscBuf[i] < 0x80)
309 escString.Append(pUnEscBuf[i]);
314 uni.Format(7, L"\\u%04x", pUnEscBuf[i]);
315 escString.Append(uni);
325 }}} // Tizen::Web::Json