d7a0ec5a3083e6e9c22b0fd9a6112f6dd9e20964
[platform/framework/native/messaging.git] / src / FMsg_PushUrlRequestListener.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17 /**
18  * @file                        FMsg_PushUrlRequestListener.cpp
19  * @brief               This is the implementation file for %_PushUrlRequestListener class.
20  *
21  * This file contains implementation of _PushUrlRequestListener class.
22  */
23
24 #include <FBaseByteBuffer.h>
25 #include <FBaseString.h>
26 #include <FBaseSysLog.h>
27 #include <FBaseUtilStringUtil.h>
28 #include <FBaseUtilStringTokenizer.h>
29 #include "FMsg_PushUrlRequestListener.h"
30 #include "FMsg_PushManagerImpl.h"
31
32 using namespace Tizen::Base;
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Base::Utility;
35 using namespace Tizen::Net::Http;
36
37 namespace Tizen { namespace Messaging
38 {
39
40 _PushUrlRequestListener::_PushUrlRequestListener(void)
41  : __pPushRequest(null)
42 {
43 }
44
45 _PushUrlRequestListener::~_PushUrlRequestListener(void)
46 {
47         __pPushRequest = null;
48 }
49
50 void
51 _PushUrlRequestListener::OnTransactionReadyToRead(HttpSession& httpSession, HttpTransaction& httpTransaction, int availableBodyLen)
52 {
53         SysLog(NID_MSG, "####### OnTransactionReadyToRead! #######");
54 }
55
56 void
57 _PushUrlRequestListener::OnTransactionAborted(HttpSession& httpSession, HttpTransaction& httpTransaction, result r)
58 {
59         SysLog(NID_MSG, "####### OnTransactionAborted! (%s)#######", GetErrorMessage(r));
60
61         _UserData* pUserData = dynamic_cast<_UserData*> (httpTransaction.GetUserObject());
62         SysTryReturnVoidResult(NID_MSG, pUserData != null, E_SYSTEM, "[E_SYSTEM] Failed to cast user data.");
63
64         delete pUserData;
65
66         delete &httpTransaction;
67 }
68
69 void
70 _PushUrlRequestListener::OnTransactionReadyToWrite(HttpSession& httpSession, HttpTransaction& httpTransaction, int recommendedChunkSize)
71 {
72         SysLog(NID_MSG, "####### OnTransactionReadyToWrite! #######");
73 }
74
75 void
76 _PushUrlRequestListener::OnTransactionHeaderCompleted(HttpSession& httpSession, HttpTransaction& httpTransaction, int headerLen, bool rs)
77 {
78         SysLog(NID_MSG, "####### OnTransactionHeaderCompleted! #######");
79 }
80
81 void
82 _PushUrlRequestListener::OnTransactionCompleted(HttpSession& httpSession, HttpTransaction& httpTransaction)
83 {
84         SysLog(NID_MSG, "####### OnTransactionCompleted! #######");
85
86         HttpResponse* pResponse = httpTransaction.GetResponse();
87         SysTryReturnVoidResult(NID_MSG, pResponse != null, E_SYSTEM, "[E_SYSTEM] HttpResponse is invalid.");
88
89         result r = E_SUCCESS;
90         _PushManagerImpl* pManager = null;
91         String response;
92         ByteBuffer tempBuffer;
93         _UserData* pUserData = dynamic_cast<_UserData*> (httpTransaction.GetUserObject());
94         SysTryReturnVoidResult(NID_MSG, pUserData != null, E_SYSTEM, "[E_SYSTEM] Failed to cast user data.");
95
96         if (pResponse->GetHttpStatusCode() == HTTP_STATUS_OK)
97         {
98                 ByteBuffer* pBody = pResponse->ReadBodyN();
99                 SysTryReturnVoidResult(NID_MSG, pBody != null, E_SYSTEM, "[E_SYSTEM] Failed to read body.");
100
101                 r = tempBuffer.Construct(pBody->GetRemaining() + 1);
102                 SysTryReturnVoidResult(NID_MSG, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] Failed to construct byte buffer.");
103
104                 r = tempBuffer.CopyFrom(*pBody);
105                 SysTryReturnVoidResult(NID_MSG, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] Failed to copy from body.");
106
107                 SysLog(NID_MSG, "The read body is %s.", tempBuffer.GetPointer());
108
109                 StringUtil::Utf8ToString((char*) tempBuffer.GetPointer(), response);
110
111                 SysLog(NID_MSG, "The read body response is %ls.", response.GetPointer());
112
113                 StringTokenizer tokens(response, L"&");
114
115                 while (tokens.HasMoreTokens() == true)
116                 {
117                         String token;
118                         String key;
119                         String value;
120                         int delimiterIndex;
121                         int resultValue;
122                         String urlValue;
123
124                         tokens.GetNextToken(token);
125
126                         r = token.IndexOf(L"=", 0, delimiterIndex);
127                         if(IsFailed(r))
128                                 continue;
129
130                         r = token.SubString(0, delimiterIndex, key);
131                         if (IsFailed(r))
132                                 continue;
133
134                         r = token.SubString(delimiterIndex + 1, token.GetLength() - delimiterIndex - 1, value);
135                         if (IsFailed(r))
136                                 continue;
137
138                         if ((key.IsEmpty() == true) || (value.IsEmpty() == true))
139                                 continue;
140
141                         if (key.Equals(L"resultcode", false) == true)
142                         {
143                                 r = Integer::Parse(value, resultValue);
144                                 if (IsFailed(r))
145                                         continue;
146                         }
147                         else if (key.Equals(L"url", false) == true)
148                         {
149                                 urlValue = value;
150                                 urlValue.Append(L"/spp/pns/api/push");
151                                 SysLog(NID_MSG, "The read body url is %ls.", urlValue.GetPointer());
152
153                                 pManager = __pPushRequest->GetPushManager();
154                                 pManager->UpdatePushServerUrl(urlValue);
155
156                                 r = pManager->SendHttpRequest(urlValue, __pPushRequest, *(pUserData->GetPushMessage()), *(pUserData->GetRegistrationIdList()));
157                                 SysTryReturnVoidResult(NID_MSG, r == E_SUCCESS, r, "[%s] Failed to submit http request.", GetErrorMessage(r));
158                         }
159                         else
160                         {
161                                 SysLog(NID_MSG, "Ignore UnKnown option[%ls]", key.GetPointer());
162                         }
163                 }
164
165                 delete pBody;
166         }
167
168         delete pUserData;
169
170         delete &httpTransaction;
171 }
172
173 void
174 _PushUrlRequestListener::OnTransactionCertVerificationRequiredN(HttpSession& httpSession, HttpTransaction& httpTransaction, String* pCert)
175 {
176         SysLog(NID_MSG, "####### OnTransactionCertVerificationRequiredN! #######");
177
178         result r = httpTransaction.Resume();
179         SysTryReturnVoidResult(NID_MSG, r == E_SUCCESS, r = E_SYSTEM, "[E_SYSTEM] http transaction resume.");
180
181         delete pCert;
182
183         return;
184 }
185
186 void
187 _PushUrlRequestListener::SetParams(const _PushRequest* pPushRequestSet)
188 {
189         __pPushRequest = pPushRequestSet;
190 }
191
192 _UserData::_UserData(HttpUrlEncodedEntity* pHttpUrlEncodedEntity, PushMessage* pPushMessage, IList* pRegistrationIdList)
193         : __pHttpUrlEncodedEntity(pHttpUrlEncodedEntity),
194           __pPushMessage(pPushMessage),
195           __pRegistrationIdList(pRegistrationIdList)
196 {
197 }
198
199 _UserData::~_UserData(void)
200 {
201         if (__pHttpUrlEncodedEntity != null)
202         {
203                 delete __pHttpUrlEncodedEntity;
204                 __pHttpUrlEncodedEntity = null;
205         }
206
207         if (__pPushMessage != null)
208         {
209                 delete __pPushMessage;
210                 __pPushMessage = null;
211         }
212
213         if (__pRegistrationIdList != null)
214         {
215                 delete __pRegistrationIdList;
216                 __pRegistrationIdList = null;
217         }
218 }
219
220 PushMessage*
221 _UserData::GetPushMessage(void)
222 {
223         return __pPushMessage;
224 }
225
226 IList*
227 _UserData::GetRegistrationIdList(void)
228 {
229         return __pRegistrationIdList;
230 }
231
232 } } // Tizen::Messaging