blob: 0e6249f8ca6f8464a31bfc8ecedc9b1d6ef18fea [file] [log] [blame]
Nicolas Jager6e30ad82016-08-26 13:00:27 -04001/**************************************************************************
atraczykb724d332016-08-30 15:25:59 -04002* Copyright (C) 2016 by Savoir-faire Linux *
3* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
4* Author: Traczyk Andreas <traczyk.andreas@savoirfairelinux.com> *
5* *
6* This program is free software; you can redistribute it and/or modify *
7* it under the terms of the GNU General Public License as published by *
8* the Free Software Foundation; either version 3 of the License, or *
9* (at your option) any later version. *
10* *
11* This program is distributed in the hope that it will be useful, *
12* but WITHOUT ANY WARRANTY; without even the implied warranty of *
13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14* GNU General Public License for more details. *
15* *
16* You should have received a copy of the GNU General Public License *
17* along with this program. If not, see <http://www.gnu.org/licenses/>. *
18**************************************************************************/
19#include "pch.h"
20
21/* daemon */
22#include <dring.h>
23#include "callmanager_interface.h"
24#include "configurationmanager_interface.h"
25#include "presencemanager_interface.h"
atraczyk14ba30c2016-09-22 18:31:59 -040026#include "videomanager_interface.h"
atraczykb724d332016-08-30 15:25:59 -040027#include "fileutils.h"
atraczykb724d332016-08-30 15:25:59 -040028#include "account_schema.h"
atraczyk196936e2016-09-02 15:31:53 -040029#include "account_const.h"
atraczykb724d332016-08-30 15:25:59 -040030
31#include "SmartPanel.xaml.h"
32
33using namespace Windows::ApplicationModel::Core;
34using namespace Windows::Storage;
35using namespace Windows::UI::Core;
atraczyk14ba30c2016-09-22 18:31:59 -040036using namespace Windows::Media;
37using namespace Windows::Media::MediaProperties;
38using namespace Windows::Media::Capture;
atraczykb724d332016-08-30 15:25:59 -040039
40using namespace RingClientUWP;
41using namespace RingClientUWP::Utils;
Nicolas Jager655df542016-08-31 10:24:47 -040042using namespace RingClientUWP::ViewModel;
atraczykb724d332016-08-30 15:25:59 -040043
44void
atraczykb724d332016-08-30 15:25:59 -040045RingClientUWP::RingD::reloadAccountList()
46{
47 RingClientUWP::ViewModel::AccountsViewModel::instance->clearAccountList();
48 std::vector<std::string> accountList = DRing::getAccountList();
49 std::vector<std::string>::reverse_iterator rit = accountList.rbegin();
50 for (; rit != accountList.rend(); ++rit) {
51 std::map<std::string,std::string> accountDetails = DRing::getAccountDetails(*rit);
atraczyk299aeb92016-09-21 15:13:15 -040052 std::string ringID(accountDetails.find(DRing::Account::ConfProperties::USERNAME)->second);
atraczykb724d332016-08-30 15:25:59 -040053 if(!ringID.empty())
54 ringID = ringID.substr(5);
55 RingClientUWP::ViewModel::AccountsViewModel::instance->add(
atraczyk299aeb92016-09-21 15:13:15 -040056 accountDetails.find(DRing::Account::ConfProperties::ALIAS)->second, //name
atraczykb724d332016-08-30 15:25:59 -040057 ringID, //ringid
atraczyk299aeb92016-09-21 15:13:15 -040058 accountDetails.find(DRing::Account::ConfProperties::TYPE)->second, //type
atraczyk797fa1a2016-08-31 09:55:53 -040059 *rit);
atraczykb724d332016-08-30 15:25:59 -040060 }
61 // load user preferences
62 Configuration::UserPreferences::instance->load();
63}
64
Nicolas Jager655df542016-08-31 10:24:47 -040065/* nb: send message during conversation not chat video message */
66void RingClientUWP::RingD::sendAccountTextMessage(String^ message)
67{
68 /* account id */
69 auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
70 std::wstring accountId2(accountId->Begin());
71 std::string accountId3(accountId2.begin(), accountId2.end());
72
73 /* recipient */
Nicolas Jagerc551c362016-10-01 19:24:50 -040074 auto item = SmartPanelItemsViewModel::instance->_selectedItem;
75 auto contact = item->_contact;
Nicolas Jager655df542016-08-31 10:24:47 -040076 auto toRingId = contact->ringID_;
77 std::wstring toRingId2(toRingId->Begin());
78 std::string toRingId3(toRingId2.begin(), toRingId2.end());
79
80 /* payload(s) */
81 std::wstring message2(message->Begin());
82 std::string message3(message2.begin(), message2.end());
83 std::map<std::string, std::string> payloads;
84 payloads["text/plain"] = message3;
85
86 /* daemon */
87 auto sent = DRing::sendAccountTextMessage(accountId3, toRingId3, payloads);
88
89 /* conversation */
90 if (sent) {
91 contact->_conversation->addMessage(""/* date not yet used*/, MSG_FROM_ME, message);
atraczykf5be5462016-08-31 14:23:06 -040092
93 /* save contacts conversation to disk */
94 contact->saveConversationToFile();
95
Nicolas Jager655df542016-08-31 10:24:47 -040096 } else {
97 WNG_("message not sent, see daemon outputs");
98 }
99}
100
atraczykb724d332016-08-30 15:25:59 -0400101void
atraczyk196936e2016-09-02 15:31:53 -0400102RingD::createRINGAccount(String^ alias)
103{
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400104 // refactoring : create a dedicated class constructor task and removes accountName from RingD
atraczyk196936e2016-09-02 15:31:53 -0400105 accountName = Utils::toString(alias);
106 tasksList_.push(ref new RingD::Task(Request::AddRingAccount));
107}
108
109void
110RingD::createSIPAccount(String^ alias)
111{
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400112 // refactoring : create a dedicated class constructor task and removes accountName from RingD
atraczyk196936e2016-09-02 15:31:53 -0400113 accountName = Utils::toString(alias);
114 tasksList_.push(ref new RingD::Task(Request::AddSIPAccount));
115}
116
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400117void RingClientUWP::RingD::refuseIncommingCall(String^ callId)
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400118{
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400119 tasksList_.push(ref new RingD::Task(Request::RefuseIncommingCall, callId));
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400120}
121
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400122void RingClientUWP::RingD::acceptIncommingCall(String^ callId)
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400123{
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400124 tasksList_.push(ref new RingD::Task(Request::AcceptIncommingCall, callId));
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400125}
126
Nicolas Jager5750df02016-09-13 11:20:33 -0400127void RingClientUWP::RingD::placeCall(Contact^ contact)
128{
Nicolas Jager9edbea32016-10-03 09:13:53 -0400129 MSG_("!--->> placeCall");
Nicolas Jager5750df02016-09-13 11:20:33 -0400130 auto to = contact->ringID_;
131 auto accountId = AccountsViewModel::instance->selectedAccount->accountID_;
132
133 auto to2 = Utils::toString(to);
134 auto accountId2 = Utils::toString(accountId);
135
136 auto callId2 = DRing::placeCall(accountId2, to2);
137
Nicolas Jager9edbea32016-10-03 09:13:53 -0400138
139
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400140 if (callId2.empty()) {
Nicolas Jager5750df02016-09-13 11:20:33 -0400141 WNG_("call not created, the daemon didn't return a call Id");
142 return;
143 }
144
145 auto callId = Utils::toPlatformString(callId2);
146
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400147 _callIdsList->Append(callId);
Nicolas Jager9edbea32016-10-03 09:13:53 -0400148
149 //auto con = ContactsViewModel::instance->findContactByName(to);
150 auto item = SmartPanelItemsViewModel::instance->findItem(contact);
151 item->_callId = callId;
152 MSG_("$1 place call with id : " + Utils::toString(item->_callId));
153
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400154 callPlaced(callId);
Nicolas Jager9edbea32016-10-03 09:13:53 -0400155
Nicolas Jager9edbea32016-10-03 09:13:53 -0400156}
157
158void RingClientUWP::RingD::cancelOutGoingCall2(String ^ callId)
159{
160 MSG_("$1 cancelOutGoingCall2 : " + Utils::toString(callId));
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400161 tasksList_.push(ref new RingD::Task(Request::HangUpCall, callId));
Nicolas Jager5750df02016-09-13 11:20:33 -0400162}
163
Nicolas Jager121bdf32016-09-13 12:12:15 -0400164
Nicolas Jager9edbea32016-10-03 09:13:53 -0400165void RingClientUWP::RingD::hangUpCall2(String ^ callId)
166{
167 MSG_("$1 hangUpCall2 : "+Utils::toString(callId));
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400168 tasksList_.push(ref new RingD::Task(Request::HangUpCall, callId));
Nicolas Jager9edbea32016-10-03 09:13:53 -0400169}
170
Nicolas Jager121bdf32016-09-13 12:12:15 -0400171void
atraczykb724d332016-08-30 15:25:59 -0400172RingClientUWP::RingD::startDaemon()
173{
174 create_task([&]()
175 {
176 using SharedCallback = std::shared_ptr<DRing::CallbackWrapperBase>;
177 using namespace std::placeholders;
178
Nicolas Jagerd83bc542016-09-16 12:07:31 -0400179 auto dispatcher = CoreApplication::MainView->CoreWindow->Dispatcher;
180
atraczykb724d332016-08-30 15:25:59 -0400181 std::map<std::string, SharedCallback> callHandlers = {
182 // use IncomingCall only to register the call client sided, use StateChange to determine the impact on the UI
183 DRing::exportable_callback<DRing::CallSignal::IncomingCall>([this](
184 const std::string& accountId,
185 const std::string& callId,
186 const std::string& from)
187 {
188 MSG_("<IncomingCall>");
189 MSG_("accountId = " + accountId);
190 MSG_("callId = " + callId);
191 MSG_("from = " + from);
192
193 auto accountId2 = toPlatformString(accountId);
194 auto callId2 = toPlatformString(callId);
195 auto from2 = toPlatformString(from);
196
Nicolas Jagerf494bda2016-09-16 08:43:43 -0400197 /* fix some issue in the daemon --> <...@...> */
198 from2 = Utils::TrimRingId(from2);
199
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400200 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
Nicolas Jager9edbea32016-10-03 09:13:53 -0400201 CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400202 {
203 incomingCall(accountId2, callId2, from2);
Nicolas Jagerc551c362016-10-01 19:24:50 -0400204 stateChange(callId2, CallStatus::INCOMING_RINGING, 0);
Nicolas Jager9edbea32016-10-03 09:13:53 -0400205
Nicolas Jager9edbea32016-10-03 09:13:53 -0400206 auto contact = ContactsViewModel::instance->findContactByName(from2);
207 auto item = SmartPanelItemsViewModel::instance->findItem(contact);
208 item->_callId = callId2;
209
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400210 }));
atraczykb724d332016-08-30 15:25:59 -0400211 }),
212 DRing::exportable_callback<DRing::CallSignal::StateChange>([this](
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400213 const std::string& callId,
214 const std::string& state,
215 int code)
atraczykb724d332016-08-30 15:25:59 -0400216 {
217 MSG_("<StateChange>");
218 MSG_("callId = " + callId);
219 MSG_("state = " + state);
220 MSG_("code = " + std::to_string(code));
221
222 auto callId2 = toPlatformString(callId);
223 auto state2 = toPlatformString(state);
224
Nicolas Jagerc551c362016-10-01 19:24:50 -0400225 auto state3 = getCallStatus(state2);
226
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400227 if (state3 == CallStatus::ENDED)
228 DRing::hangUp(callId); // solve a bug in the daemon API.
229
atraczykb724d332016-08-30 15:25:59 -0400230
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400231 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
Nicolas Jager9edbea32016-10-03 09:13:53 -0400232 CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400233 {
Nicolas Jagerc551c362016-10-01 19:24:50 -0400234 stateChange(callId2, state3, code);
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400235 }));
atraczykb724d332016-08-30 15:25:59 -0400236 }),
Nicolas Jager6e30ad82016-08-26 13:00:27 -0400237 DRing::exportable_callback<DRing::ConfigurationSignal::IncomingAccountMessage>([&](
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400238 const std::string& accountId,
239 const std::string& from,
240 const std::map<std::string, std::string>& payloads)
atraczykb724d332016-08-30 15:25:59 -0400241 {
242 MSG_("<IncomingAccountMessage>");
243 MSG_("accountId = " + accountId);
244 MSG_("from = " + from);
245
Nicolas Jager6e30ad82016-08-26 13:00:27 -0400246 auto accountId2 = toPlatformString(accountId);
247 auto from2 = toPlatformString(from);
248
atraczykb724d332016-08-30 15:25:59 -0400249 for (auto i : payloads) {
250 MSG_("payload = " + i.second);
251 auto payload = Utils::toPlatformString(i.second);
Nicolas Jager6e30ad82016-08-26 13:00:27 -0400252 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
Nicolas Jager9edbea32016-10-03 09:13:53 -0400253 CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
Nicolas Jager6e30ad82016-08-26 13:00:27 -0400254 {
255 incomingAccountMessage(accountId2, from2, payload);
256 }));
atraczykb724d332016-08-30 15:25:59 -0400257 }
258 }),
atraczyk5c395ea2016-09-20 17:28:09 -0400259 DRing::exportable_callback<DRing::CallSignal::IncomingMessage>([&](
260 const std::string& callId,
261 const std::string& from,
262 const std::map<std::string, std::string>& payloads)
263 {
264 MSG_("<IncomingMessage>");
265 MSG_("callId = " + callId);
266 MSG_("from = " + from);
267
268 auto callId2 = toPlatformString(callId);
269 auto from2 = toPlatformString(from);
270
271 from2 = Utils::TrimRingId2(from2);
272
atraczyk5c395ea2016-09-20 17:28:09 -0400273
atraczyk5c395ea2016-09-20 17:28:09 -0400274 const std::string PROFILE_VCF = "x-ring/ring.profile.vcard";
275 static const unsigned int profileSize = PROFILE_VCF.size();
276
277 for (auto i : payloads) {
278 if (i.first.compare(0, profileSize, PROFILE_VCF) == 0) {
279 MSG_("VCARD");
280 return;
281 }
282 MSG_("payload.first = " + i.first);
283 MSG_("payload.second = " + i.second);
284
285 auto payload = Utils::toPlatformString(i.second);
286 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
Nicolas Jager9edbea32016-10-03 09:13:53 -0400287 CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
atraczyk5c395ea2016-09-20 17:28:09 -0400288 {
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400289 // DOIT ETRE DIFFEREND.... NE PAS UTILISE accoutId2
290 //incomingAccountMessage(accountId2, from2, payload);
291 MSG_("message recu :" + i.second);
atraczyk5c395ea2016-09-20 17:28:09 -0400292 }));
293 }
294 }),
atraczyk196936e2016-09-02 15:31:53 -0400295 DRing::exportable_callback<DRing::ConfigurationSignal::RegistrationStateChanged>([this](
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400296 const std::string& account_id, const std::string& state,
297 int detailsCode, const std::string& detailsStr)
atraczyk196936e2016-09-02 15:31:53 -0400298 {
299 MSG_("<RegistrationStateChanged>: ID = " + account_id + "state = " + state);
atraczyk1ddcb5a2016-09-07 16:18:30 -0400300 if (state == DRing::Account::States::REGISTERED) {
Nicolas Jager9edbea32016-10-03 09:13:53 -0400301 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400302 ref new DispatchedHandler([=]() {
atraczyk299aeb92016-09-21 15:13:15 -0400303 reloadAccountList();
atraczyk1ddcb5a2016-09-07 16:18:30 -0400304 auto frame = dynamic_cast<Frame^>(Window::Current->Content);
305 dynamic_cast<RingClientUWP::MainPage^>(frame->Content)->showLoadingOverlay(false, false);
atraczyk196936e2016-09-02 15:31:53 -0400306 }));
307 }
308 }),
atraczykb724d332016-08-30 15:25:59 -0400309 DRing::exportable_callback<DRing::ConfigurationSignal::AccountsChanged>([this]()
310 {
Nicolas Jager9edbea32016-10-03 09:13:53 -0400311 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::High,
Nicolas Jager655df542016-08-31 10:24:47 -0400312 ref new DispatchedHandler([=]() {
atraczykb724d332016-08-30 15:25:59 -0400313 reloadAccountList();
314 }));
Nicolas Jager5750df02016-09-13 11:20:33 -0400315 }),
Nicolas Jagerd83bc542016-09-16 12:07:31 -0400316 DRing::exportable_callback<DRing::Debug::MessageSend>([&](const std::string& toto)
317 {
Nicolas Jager9edbea32016-10-03 09:13:53 -0400318 dispatcher->RunAsync(CoreDispatcherPriority::High,
Nicolas Jagerd83bc542016-09-16 12:07:31 -0400319 ref new DispatchedHandler([=]() {
320 RingDebug::instance->print(toto);
321 }));
322 })
atraczykb724d332016-08-30 15:25:59 -0400323 };
atraczykb724d332016-08-30 15:25:59 -0400324 registerCallHandlers(callHandlers);
325
atraczykb724d332016-08-30 15:25:59 -0400326 std::map<std::string, SharedCallback> getAppPathHandler =
327 {
328 DRing::exportable_callback<DRing::ConfigurationSignal::GetAppDataPath>
329 ([this](std::vector<std::string>* paths) {
330 paths->emplace_back(localFolder_);
331 })
332 };
333 registerCallHandlers(getAppPathHandler);
334
atraczyk14ba30c2016-09-22 18:31:59 -0400335 std::map<std::string, SharedCallback> incomingVideoHandlers =
336 {
337 DRing::exportable_callback<DRing::VideoSignal::DeviceEvent>
338 ([this]() {
339 MSG_("<DeviceEvent>");
340 }),
341 DRing::exportable_callback<DRing::VideoSignal::DecodingStarted>
342 ([this](const std::string &id, const std::string &shmPath, int width, int height, bool isMixer) {
343 MSG_("<DecodingStarted>");
344 Video::VideoManager::instance->rendererManager()->startedDecoding(
345 Utils::toPlatformString(id),
346 width,
347 height);
348 }),
349 DRing::exportable_callback<DRing::VideoSignal::DecodingStopped>
350 ([this](const std::string &id, const std::string &shmPath, bool isMixer) {
351 MSG_("<DecodingStopped>");
352 MSG_("Removing renderer id:" + id);
353 /*auto Id = Utils::toPlatformString(id);
354 auto renderer = Video::VideoManager::instance->rendererManager()->renderer(Id);
355 if (renderer)
356 renderer->isRendering = false;*/
357 Video::VideoManager::instance->rendererManager()->removeRenderer(Utils::toPlatformString(id));
358 })
359 };
360 registerVideoHandlers(incomingVideoHandlers);
361
362 using namespace Video;
363 std::map<std::string, SharedCallback> outgoingVideoHandlers =
364 {
365 DRing::exportable_callback<DRing::VideoSignal::GetCameraInfo>
366 ([this](const std::string& device,
Nicolas Jager9edbea32016-10-03 09:13:53 -0400367 std::vector<std::string> *formats,
368 std::vector<unsigned> *sizes,
369 std::vector<unsigned> *rates) {
atraczyk14ba30c2016-09-22 18:31:59 -0400370 MSG_("\n<GetCameraInfo>\n");
371 auto device_list = VideoManager::instance->captureManager()->deviceList;
372
373 for (unsigned int i = 0; i < device_list->Size; i++) {
374 auto dev = device_list->GetAt(i);
375 if (device == Utils::toString(dev->name())) {
376 auto channel = dev->channel();
377 Vector<Video::Resolution^>^ resolutions = channel->resolutionList();
378 for (auto res : resolutions) {
379 formats->emplace_back(Utils::toString(res->format()));
380 sizes->emplace_back(res->size()->width());
381 sizes->emplace_back(res->size()->height());
382 rates->emplace_back(res->activeRate()->value());
383 }
384 }
385 }
386 }),
387 DRing::exportable_callback<DRing::VideoSignal::SetParameters>
388 ([this](const std::string& device,
389 std::string format,
390 const int width,
391 const int height,
Nicolas Jager9edbea32016-10-03 09:13:53 -0400392 const int rate) {
atraczyk14ba30c2016-09-22 18:31:59 -0400393 MSG_("\n<SetParameters>\n");
394 VideoManager::instance->captureManager()->activeDevice->SetDeviceProperties(
395 Utils::toPlatformString(format),width,height,rate);
396 }),
397 DRing::exportable_callback<DRing::VideoSignal::StartCapture>
398 ([&](const std::string& device) {
399 MSG_("\n<StartCapture>\n");
Nicolas Jager9edbea32016-10-03 09:13:53 -0400400 dispatcher->RunAsync(CoreDispatcherPriority::High,
atraczyk14ba30c2016-09-22 18:31:59 -0400401 ref new DispatchedHandler([=]() {
402 VideoManager::instance->captureManager()->InitializeCameraAsync();
403 VideoManager::instance->captureManager()->videoFrameCopyInvoker->Start();
404 }));
405 }),
406 DRing::exportable_callback<DRing::VideoSignal::StopCapture>
407 ([&]() {
408 MSG_("\n<StopCapture>\n");
Nicolas Jager9edbea32016-10-03 09:13:53 -0400409 dispatcher->RunAsync(CoreDispatcherPriority::High,
atraczyk14ba30c2016-09-22 18:31:59 -0400410 ref new DispatchedHandler([=]() {
411 VideoManager::instance->captureManager()->StopPreviewAsync();
412 if (VideoManager::instance->captureManager()->captureTaskTokenSource)
413 VideoManager::instance->captureManager()->captureTaskTokenSource->cancel();
414 VideoManager::instance->captureManager()->videoFrameCopyInvoker->Stop();
415 }));
416 })
417 };
418 registerVideoHandlers(outgoingVideoHandlers);
419
Nicolas Jageraef65722016-09-06 08:30:14 -0400420 DRing::init(static_cast<DRing::InitFlag>(DRing::DRING_FLAG_CONSOLE_LOG |
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400421 DRing::DRING_FLAG_DEBUG));
atraczykb724d332016-08-30 15:25:59 -0400422
423 if (!DRing::start()) {
424 ERR_("\ndaemon didn't start.\n");
425 return;
426 }
427 else {
Nicolas Jagere4eb5132016-10-04 14:25:15 -0400428 switch (_startingStatus) {
429 case StartingStatus::REGISTERING_ON_THIS_PC:
430 {
atraczyk4464ace2016-09-01 09:37:37 -0400431 tasksList_.push(ref new RingD::Task(Request::AddRingAccount));
432 tasksList_.push(ref new RingD::Task(Request::AddSIPAccount));
Nicolas Jagere4eb5132016-10-04 14:25:15 -0400433 break;
atraczykb724d332016-08-30 15:25:59 -0400434 }
Nicolas Jagere4eb5132016-10-04 14:25:15 -0400435 case StartingStatus::REGISTERING_THIS_DEVICE:
436 {
437 tasksList_.push(ref new RingD::Task(Request::RegisterDevice, _pin, _password));
438 break;
439 }
440 case StartingStatus::NORMAL:
441 default:
442 {
443 CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
Nicolas Jager655df542016-08-31 10:24:47 -0400444 ref new DispatchedHandler([=]() {
atraczykb724d332016-08-30 15:25:59 -0400445 reloadAccountList();
446 }));
Nicolas Jagere4eb5132016-10-04 14:25:15 -0400447 break;
atraczykb724d332016-08-30 15:25:59 -0400448 }
Nicolas Jagere4eb5132016-10-04 14:25:15 -0400449 }
450
atraczykb724d332016-08-30 15:25:59 -0400451 while (true) {
452 DRing::pollEvents();
atraczykb724d332016-08-30 15:25:59 -0400453 dequeueTasks();
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400454 Sleep(1000);
atraczykb724d332016-08-30 15:25:59 -0400455 }
456 DRing::fini();
457 }
458 });
459}
460
461RingD::RingD()
462{
463 localFolder_ = Utils::toString(ApplicationData::Current->LocalFolder->Path);
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400464 callIdsList_ = ref new Vector<String^>();
atraczykb724d332016-08-30 15:25:59 -0400465}
466
467void
468RingD::dequeueTasks()
469{
470 for (int i = 0; i < tasksList_.size(); i++) {
471 auto task = tasksList_.front();
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400472 auto request = dynamic_cast<Task^>(task)->request;
473 switch (request) {
atraczykb724d332016-08-30 15:25:59 -0400474 case Request::None:
atraczyk4464ace2016-09-01 09:37:37 -0400475 break;
476 case Request::AddRingAccount:
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400477 {
478 std::map<std::string, std::string> ringAccountDetails;
atraczyk299aeb92016-09-21 15:13:15 -0400479 ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ALIAS, accountName));
480 ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ARCHIVE_PASSWORD, accountName));
481 ringAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::TYPE,"RING"));
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400482 DRing::addAccount(ringAccountDetails);
483 }
484 break;
atraczyk4464ace2016-09-01 09:37:37 -0400485 case Request::AddSIPAccount:
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400486 {
487 std::map<std::string, std::string> sipAccountDetails;
atraczyk299aeb92016-09-21 15:13:15 -0400488 sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::ALIAS, accountName + " (SIP)"));
489 sipAccountDetails.insert(std::make_pair(DRing::Account::ConfProperties::TYPE,"SIP"));
Nicolas Jagerd76940f2016-08-31 14:44:04 -0400490 DRing::addAccount(sipAccountDetails);
491 }
492 break;
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400493 case Request::RefuseIncommingCall:
494 {
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400495 auto callId = task->_callId;
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400496 auto callId2 = Utils::toString(callId);
497 DRing::refuse(callId2);
498 }
499 break;
500 case Request::AcceptIncommingCall:
501 {
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400502 auto callId = task->_callId;
Nicolas Jagerf6a10322016-09-06 08:17:49 -0400503 auto callId2 = Utils::toString(callId);
504 DRing::accept(callId2);
505 }
506 break;
Nicolas Jager5750df02016-09-13 11:20:33 -0400507 case Request::CancelOutGoingCall:
Nicolas Jager121bdf32016-09-13 12:12:15 -0400508 case Request::HangUpCall:
Nicolas Jager5750df02016-09-13 11:20:33 -0400509 {
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400510 auto callId = task->_callId;
511 DRing::hangUp(Utils::toString(callId));
Nicolas Jager5750df02016-09-13 11:20:33 -0400512 }
513 break;
Nicolas Jagere4eb5132016-10-04 14:25:15 -0400514 case Request::RegisterDevice:
515 {
516 auto pin = Utils::toString(_pin);
517 auto password = Utils::toString(_password);
518
519 std::map<std::string, std::string> deviceDetails;
520 deviceDetails.insert(std::make_pair(DRing::Account::ConfProperties::TYPE, "RING"));
521 //deviceDetails.insert(std::make_pair(DRing::Account::ConfProperties::UPNP_ENABLED, "true"));
522 //deviceDetails.insert(std::make_pair(DRing::Account::ConfProperties::ALIAS, "MonSuperUsername"));
523 deviceDetails.insert(std::make_pair(DRing::Account::ConfProperties::ARCHIVE_PIN, pin));
524 deviceDetails.insert(std::make_pair(DRing::Account::ConfProperties::ARCHIVE_PASSWORD, password));
525 DRing::addAccount(deviceDetails);
526 }
atraczykb724d332016-08-30 15:25:59 -0400527 default:
528 break;
529 }
530 tasksList_.pop();
531 }
532}
Nicolas Jagerc551c362016-10-01 19:24:50 -0400533
Nicolas Jager083b3ae2016-10-04 08:46:19 -0400534RingClientUWP::CallStatus RingClientUWP::RingD::getCallStatus(String^ state)
Nicolas Jagerc551c362016-10-01 19:24:50 -0400535{
536 if (state == "INCOMING")
537 return CallStatus::INCOMING_RINGING;
538
539 if (state == "CURRENT")
540 return CallStatus::IN_PROGRESS;
541
542 if (state == "OVER")
543 return CallStatus::ENDED;
544
545 if (state == "RINGING")
546 return CallStatus::OUTGOING_RINGING;
547
548 if (state == "CONNECTING")
549 return CallStatus::SEARCHING;
550
551 return CallStatus::NONE;
552}