60c1b5e05ef3c2f18abfef3a4e4c8f5e00a57514
[framework/web/wrt-plugins-tizen.git] / src / SecureElement / SEReader.cpp
1 //
2 // Tizen Web Device API
3 // Copyright (c) 2012 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
19
20 #include <dpl/log/log.h>
21
22 #include <Commons/Exception.h>
23
24 #include "SEReader.h"
25 #include "SEUtil.h"
26
27
28 using namespace WrtDeviceApis;
29 using namespace smartcard_service_api;
30
31 namespace DeviceAPI {
32 namespace SecureElement {
33 namespace
34 {
35         static void openSessionCallback(SessionHelper *session, int error, void *userData) {
36                 LogDebug("Callback openSessionCallback.");
37                 if (userData) {
38                         SEReader *sePtr = (SEReader *)((EventSEPtrs<EventSEOpenSession> *)userData)->getThisPtr();
39                         if (sePtr) {
40                                 EventSEOpenSessionPtr event = ((EventSEPtrs<EventSEOpenSession> *)userData)->getEventPtrs();
41                                 sePtr->openSessionManualAnswer((void *)session, error, event);
42                         }
43                 } else {
44                         LogError("Callback private data is NULL.");
45                 }
46         }
47
48 }//private namespace
49
50 SEReader::SEReader(void *reader)
51 {
52         LogDebug("entered");
53
54         if (reader == NULL)
55                 ThrowMsg(Commons::UnknownException, "SecureElement Handler is Null Pointer.");
56
57         m_reader = (Reader *)reader;
58 }
59
60 SEReader::~SEReader()
61 {
62         LogDebug("entered");
63         m_reader->closeSessions();
64         m_reader = NULL;
65 }
66
67 std::string SEReader::getName() {
68         LogDebug("Enter" << m_reader->getName());
69         return m_reader->getName();
70 }
71
72 bool SEReader::isPresent() {
73         LogDebug("Enter" << m_reader->isSecureElementPresent());
74         return m_reader->isSecureElementPresent();
75 }
76
77 void SEReader::openSession(const EventSEOpenSessionPtr& event) {
78         LogDebug("Enter");
79         EventRequestReceiver<EventSEOpenSession>::PostRequest(event);
80 }
81
82 void SEReader::closeSessions() {
83         LogDebug("Enter");
84         m_reader->closeSessions();
85 }
86
87 void SEReader::openSessionManualAnswer(void *session, int error, const EventSEOpenSessionPtr &event) {
88         if ((error != 0) || session == NULL) {
89                 event->setResult(false);
90         } else {
91                 event->setSession(session);
92                 event->setResult(true);
93         }
94         EventRequestReceiver<EventSEOpenSession>::ManualAnswer(event);
95
96         std::vector<SEOpenSessionDataPtr>::iterator it;
97         for (it = EventSEOpenSessions.begin(); it != EventSEOpenSessions.end(); ++it) {
98                 if ((*it)->getEventPtrs() == event) {
99                         EventSEOpenSessions.erase(it);
100                         LogDebug("event is removed. (" << EventSEOpenSessions.size() << ")");
101                         break;
102                 }
103         }
104 }
105
106 void SEReader::OnRequestReceived(const EventSEOpenSessionPtr& event) {
107         LogDebug("Enter");
108         
109         try {
110                 event->switchToManualAnswer();
111
112                 SEOpenSessionDataPtr data( new EventSEPtrs<EventSEOpenSession>(event, this));
113                 EventSEOpenSessions.push_back(data);
114
115                 m_reader->openSession(openSessionCallback, data.Get());
116         } catch (const WrtDeviceApis::Commons::Exception& ex) {
117                 LogError("Exception: " << ex.GetMessage());
118                 event->setResult(false);
119         
120                 EventRequestReceiver<EventSEOpenSession>::ManualAnswer(event);
121         }
122 }
123
124 }
125 }