/[H9]/trunk/FlisServer/FlisServerDlg.cpp
ViewVC logotype

Contents of /trunk/FlisServer/FlisServerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 166 - (show annotations) (download)
Wed Dec 5 16:03:05 2007 UTC (16 years, 5 months ago) by kevin
File size: 21352 byte(s)
updated the serversoftware to fix a minor bug
1 // FlisServerDlg.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5 #include "FlisServer.h"
6 #include "FlisServerDlg.h"
7 #include <vector>
8 #include ".\flisserverdlg.h"
9 #include <atlrx.h>
10
11 #ifdef _DEBUG
12 #define new DEBUG_NEW
13 #endif
14
15
16 // CAboutDlg dialog used for App About
17
18 class CAboutDlg : public CDialog
19 {
20 public:
21 CAboutDlg();
22
23 // Dialog Data
24 enum { IDD = IDD_ABOUTBOX };
25
26 protected:
27 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
28
29 // Implementation
30 protected:
31 DECLARE_MESSAGE_MAP()
32 };
33
34 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
35 {
36 }
37
38 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
39 {
40 CDialog::DoDataExchange(pDX);
41 }
42
43 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
44 END_MESSAGE_MAP()
45
46
47 // CFlisServerDlg dialog
48
49
50
51 CFlisServerDlg::CFlisServerDlg(CWnd* pParent /*=NULL*/)
52 : CDialog(CFlisServerDlg::IDD, pParent)
53 {
54 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
55 }
56
57 void CFlisServerDlg::DoDataExchange(CDataExchange* pDX)
58 {
59 CDialog::DoDataExchange(pDX);
60 DDX_Control(pDX, IDC_Textwindow, m_Textwindow);
61 }
62
63 BEGIN_MESSAGE_MAP(CFlisServerDlg, CDialog)
64 ON_WM_SYSCOMMAND()
65 ON_WM_PAINT()
66 ON_WM_QUERYDRAGICON()
67 //}}AFX_MSG_MAP
68 ON_BN_CLICKED(IDCLOSE, OnBnClickedClose)
69 ON_BN_CLICKED(IDC_GSMPIN, OnBnClickedGsmpin)
70 ON_BN_CLICKED(IDC_Start, OnBnClickedStart)
71 END_MESSAGE_MAP()
72
73
74 // CFlisServerDlg message handlers
75
76 BOOL CFlisServerDlg::OnInitDialog()
77 {
78 CDialog::OnInitDialog();
79
80 // Add "About..." menu item to system menu.
81
82 // IDM_ABOUTBOX must be in the system command range.
83 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
84 ASSERT(IDM_ABOUTBOX < 0xF000);
85
86 CMenu* pSysMenu = GetSystemMenu(FALSE);
87 if (pSysMenu != NULL)
88 {
89 CString strAboutMenu;
90 strAboutMenu.LoadString(IDS_ABOUTBOX);
91 if (!strAboutMenu.IsEmpty())
92 {
93 pSysMenu->AppendMenu(MF_SEPARATOR);
94 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
95 }
96 }
97
98 // Set the icon for this dialog. The framework does this automatically
99 // when the application's main window is not a dialog
100 SetIcon(m_hIcon, TRUE); // Set big icon
101 SetIcon(m_hIcon, FALSE); // Set small icon
102
103 // TODO: Add extra initialization here
104 StartSerial();
105 DBConnect();
106 ResetSms = 0;
107
108 return TRUE; // return TRUE unless you set the focus to a control
109 }
110
111 void CFlisServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
112 {
113 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
114 {
115 CAboutDlg dlgAbout;
116 dlgAbout.DoModal();
117 }
118 else
119 {
120 CDialog::OnSysCommand(nID, lParam);
121 }
122 }
123
124 // If you add a minimize button to your dialog, you will need the code below
125 // to draw the icon. For MFC applications using the document/view model,
126 // this is automatically done for you by the framework.
127
128 void CFlisServerDlg::OnPaint()
129 {
130 if (IsIconic())
131 {
132 CPaintDC dc(this); // device context for painting
133
134 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
135
136 // Center icon in client rectangle
137 int cxIcon = GetSystemMetrics(SM_CXICON);
138 int cyIcon = GetSystemMetrics(SM_CYICON);
139 CRect rect;
140 GetClientRect(&rect);
141 int x = (rect.Width() - cxIcon + 1) / 2;
142 int y = (rect.Height() - cyIcon + 1) / 2;
143
144 // Draw the icon
145 dc.DrawIcon(x, y, m_hIcon);
146 }
147 else
148 {
149 CDialog::OnPaint();
150 }
151 }
152
153 // The system calls this function to obtain the cursor to display while the user drags
154 // the minimized window.
155 HCURSOR CFlisServerDlg::OnQueryDragIcon()
156 {
157 return static_cast<HCURSOR>(m_hIcon);
158 }
159 int CFlisServerDlg::StartSerial(void)
160 {
161
162 int Baud;
163
164 ConfigFile config;
165 try {
166 config.ReadSettings();
167 } catch(...) {
168 MessageBox("Could not open config file");
169 OnOK();
170 return true;
171 }
172
173 Baud = 1200;
174 if( Serial.isOpen() )
175 {
176 try
177 {
178 Serial.close();
179 Serial.open( config.comport, Baud );
180 }
181 catch (exception* e)
182 {
183 MessageBox( "Serial.open() exception" );
184 return 0;
185 }
186 }
187 else
188 {
189 try
190 {
191 Serial.open( config.comport, Baud );
192 }
193 catch (exception* e)
194 {
195 MessageBox( "Serial.open() exception 2" );
196 return 0;
197 }
198 }
199
200
201 return 0;
202 }
203 std::vector<unsigned char> CFlisServerDlg::readFrame()
204 {
205 std::vector<unsigned char> buf;
206 while(Serial.getComstat().cbInQue > 0)
207 {
208 unsigned char data = Serial.readByte();
209
210 buf.push_back(data);
211 }
212 return buf;
213 }
214
215 void CFlisServerDlg::writeFrame(std::vector<unsigned char> data)
216 {
217 for (int i=0; i<data.size(); i++)
218 {
219 Serial.writeByte( data[i] );
220 Sleep(5);
221 }
222 Serial.writeByte(0x0D);
223 Sleep(100);
224
225 }
226 void CFlisServerDlg::SetPin()
227 {
228 CString tekst;
229 std::vector<unsigned char> data;
230 data.push_back('a');
231 data.push_back('t');
232 data.push_back('+');
233 data.push_back('c');
234 data.push_back('p');
235 data.push_back('i');
236 data.push_back('n');
237 data.push_back('=');
238 data.push_back('2');
239 data.push_back('5');
240 data.push_back('9');
241 data.push_back('5');
242
243 writeFrame(data);
244 }
245 void CFlisServerDlg::SendSmsData(std::vector<unsigned char> data)
246 {
247
248 for (int i=0; i<data.size(); i++)
249 {
250 Serial.writeByte( data[i] );
251 Sleep(5);
252 }
253 Serial.writeByte(0x1A);
254 Sleep(3000);
255 if(Serial.getComstat().cbInQue > 0)
256 {
257 CString tekst;
258 std::vector<unsigned char> answer = readFrame();
259 Sleep(50);
260
261 for (int i=0; i<answer.size(); i++)
262 {
263 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
264 {
265 tekst.AppendChar(answer[i]);
266 }
267 }
268 AppendText(tekst);
269 }
270
271 }
272 void CFlisServerDlg::SendSmsHead(std::vector<unsigned char> tlfnr)
273 {
274 vector<unsigned char> atcommand;
275 atcommand.push_back('a');
276 atcommand.push_back('t');
277 atcommand.push_back('+');
278 atcommand.push_back('c');
279 atcommand.push_back('m');
280 atcommand.push_back('g');
281 atcommand.push_back('s');
282 atcommand.push_back('=');
283 atcommand.push_back('"');
284 int s = (atcommand.size() -1 );
285
286 for (int i=0; i<(atcommand.size()); i++)
287 {
288 Serial.writeByte( atcommand[i] );
289 Sleep(5);
290 }
291
292 for (int i=0; i<tlfnr.size(); i++)
293 {
294 Serial.writeByte( tlfnr[i] );
295 Sleep(5);
296 }
297 Serial.writeByte(atcommand[s]);
298 Serial.writeByte(0x0D);
299 Sleep(250);
300 }
301 void CFlisServerDlg::DBConnect()
302 {
303 CString dsn;
304 ConfigFile config;
305 try {
306 config.ReadSettings();
307 } catch(...) {
308 MessageBox("Could not open config file");
309 }
310
311 dsn.Format("ODBC;Description=asd;DRIVER=PostgreSQL ANSI;SERVER=%s; uid=%s;password=%s;database=%s;sslmode=prefer",config.host,config.username, config.password, config.database);
312 db.OpenEx(dsn, CDatabase::noOdbcDialog);
313 }
314 vector<Commands> CFlisServerDlg::DBReadCommands(void)
315 {
316 vector<Commands> buffer;
317
318 CString SQL, IDnr, CommandID, InstallationsID;
319 SQL = "select id,date_trunc('second', created) as created,executed,commandid,installationid from command WHERE executed IS NULL ORDER BY created ASC LIMIT 1;";
320 CRecordset rs(&db);
321 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
322 if (rs.GetRecordCount()>0)
323 {
324 rs.MoveFirst();
325
326 Commands Mycom;
327 rs.GetFieldValue((short)0, IDnr);
328 rs.GetFieldValue(3, CommandID);
329 rs.GetFieldValue(4, InstallationsID);
330
331 Mycom.IDnr = IDnr;
332 Mycom.CommandID = CommandID;
333 Mycom.InstallationsID = InstallationsID;
334
335 buffer.push_back(Mycom);
336 rs.MoveNext();
337
338 }
339 rs.Close();
340 return buffer;
341 }
342 void CFlisServerDlg::ReadSms()
343 {
344 CString tekst, oldtekst;
345 Sleep(950); //Holder en pause for at lade hele sms'en komme ind i serial køen.
346 if(Serial.getComstat().cbInQue > 0)
347 {
348 std::vector<unsigned char> answer = readFrame();
349 Sleep(50);
350
351 for (int i=0; i<answer.size(); i++)
352 {
353 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
354 {
355 tekst.AppendChar(answer[i]);
356 }
357 }
358
359 AppendText(tekst);
360 SmsSplit(tekst);
361 }
362 }
363 void CFlisServerDlg::SmsSplit(CString data)
364 {
365 CString FyrData, TlfNr, SmsCount, Temper, Flamme, Flis, FremFejl, PowerFail, oldtekst;
366 char CharData[150];
367 strcpy(CharData,data);
368 TlfNr = data.Mid(24,8);
369 FyrData = data.Mid(57,data.GetLength()-59);
370 FyrData.Append(":");
371
372 if (FyrData.MakeLower() == "conf ok:")
373 {
374 HandleAcknowledge(TlfNr);
375 return;
376 }
377 CAtlRegExp<> regex;
378 if (regex.Parse("^{[0-9]+}:{[0-9]+}:[0-1]:[0-1]:[0-1]:[0-1]:$") == REPARSE_ERROR_OK)
379 {
380
381 CAtlREMatchContext<> pContext;
382
383 if (!regex.Match(FyrData, &pContext))
384 {
385 AppendText("Invalid SMS recieved");
386 return;
387 }
388 }
389 else
390 {
391 AppendText("Regex PARSE error!!!"); //Burde aldrig kunne ske !
392 }
393
394 SmsCount = Splitter(FyrData);
395 Temper = Splitter(FyrData);
396 Flamme = Splitter(FyrData);
397 Flis = Splitter(FyrData);
398 FremFejl = Splitter(FyrData);
399 PowerFail = Splitter(FyrData);
400
401 CString SQL, Textwindow, InstallNR;
402 SQL.Format("select ID from installation where installationphonenr=%s",TlfNr);
403
404 CRecordset rs(&db);
405 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
406 if (rs.GetRecordCount()>0)
407 {
408 rs.MoveFirst();
409 rs.GetFieldValue((short)0,InstallNR);
410 }
411 rs.Close();
412
413 SQL.Format("insert into logtable (logtime,temperature,flamedetector,solidfuelempty,conveyorerror,powerfailure,messagenr,installationnr) Values (now(),%s,'%s','%s','%s','%s',%s,%s)",Temper, Flamme, Flis, FremFejl, PowerFail, SmsCount,InstallNR);
414 try
415 {
416 db.ExecuteSQL(SQL);
417 }
418 catch(CDBException* e)
419 {
420 MessageBox(e->m_strError);
421 }
422 AppendText("Sms added to Log");
423 Sleep(150);
424 }
425 CString CFlisServerDlg::Splitter(CString& fyrdata)
426 {
427 CString Output;
428
429 int pos = fyrdata.Find(':',0);
430 if (pos != -1)
431 {
432 Output = fyrdata.Left(pos);
433 fyrdata = fyrdata.Right( fyrdata.GetLength() - pos -1);
434 }
435 return Output;
436 }
437 void CFlisServerDlg::OnBnClickedClose()
438 {
439 // TODO: Add your control notification handler code here
440 continueThread = 0;
441 Sleep(250);
442 DeleteSms();
443
444 Sleep(500);
445 if( Serial.isOpen() )
446 {
447 Serial.close();
448 }
449
450 if(db.IsOpen())
451 {
452 db.Close();
453 }
454
455 OnOK();
456
457 }
458
459 void CFlisServerDlg::OnBnClickedGsmpin()
460 {
461 // TODO: Add your control notification handler code here
462 bool ready = true;
463 m_Textwindow.SetWindowText("Indsætter Pinkode, og venter på modem bliver klar");
464 UpdateWindow();
465 SetPin();
466 Sleep(500);
467
468 while (ready == true)
469 {
470 if (Serial.getComstat().cbInQue > 120)
471 {
472 std::vector<unsigned char> answer = readFrame();
473 CString tekst;
474
475 for (int i=0; i<answer.size(); i++)
476 {
477 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
478 {
479 tekst.AppendChar(answer[i]);
480 }
481 }
482 int n = tekst.Find("WIND: 11",0);
483 if (n > -1)
484 {
485 ready = false;
486 }
487 else
488 {
489 AppendText(tekst);
490 }
491 }
492 Sleep(10); //Small delay to avoid busy wait
493 }
494 Sleep(100); //Give the modem a chance to send the last data
495 while(Serial.getComstat().cbInQue > 0)
496 {
497 Serial.readByte(); //Flush the incoming queue
498 Sleep(1);
499 }
500 OnBnClickedStart();
501 }
502 void CFlisServerDlg::DeleteSms()
503 {
504 vector<unsigned char> atcommand;
505 atcommand.push_back('a');
506 atcommand.push_back('t');
507 atcommand.push_back('+');
508 atcommand.push_back('c');
509 atcommand.push_back('m');
510 atcommand.push_back('g');
511 atcommand.push_back('d');
512 atcommand.push_back('=');
513 atcommand.push_back('1');
514 atcommand.push_back(',');
515 atcommand.push_back('3');
516
517 writeFrame(atcommand);
518 Sleep(500);
519 }
520 UINT threadWrapper(LPVOID thread)
521 {
522 CFlisServerDlg *t = (CFlisServerDlg*) thread;
523 t->runthread();
524 return 0;
525 }
526
527 void CFlisServerDlg::startthread()
528 {
529 AfxBeginThread(threadWrapper, (LPVOID) this);
530 }
531
532 void CFlisServerDlg::runthread()
533 {
534 while (continueThread != 0)
535 {
536 Reader();
537 }
538 }
539 void CFlisServerDlg::Reader()
540 {
541 if(Serial.getComstat().cbInQue > 0)
542 {
543 Sleep(250);
544 std::vector<unsigned char> answer = readFrame();
545 Sleep(500);
546 CString tekst, oldtekst;
547 int lol;
548
549 for (int i=0; i<answer.size(); i++)
550 {
551 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
552 {
553 tekst.AppendChar(answer[i]);
554 }
555 }
556 tekst.Append(":");
557
558 CString command;
559 bool plus = false;
560 int pos = tekst.Find('+',0);
561 if (pos != -1)
562 {
563 plus = true;
564 tekst = tekst.Right( tekst.GetLength() - pos -1);
565 pos = tekst.Find(':');
566 command = tekst.Left(pos);
567 tekst = tekst.Right( tekst.GetLength() - pos -1);
568 }
569
570
571 if(tekst.MakeLower() == "ok")
572 {
573 AppendText("OK tekst modtaget");
574 }
575 else if (tekst.MakeLower() == "error")
576 {
577 CString send;
578 send.Append("error tekst");
579 send.Append("\r\n");
580 send.Append(tekst);
581 AppendText(send);
582 }
583 else if (plus == true)
584 {
585 if (command.MakeLower() == "cmti")
586 {
587 CString smscount, oldteskst;
588 int pos = tekst.Find(',',0);
589 if (pos != -1)
590 {
591 smscount = tekst.Right( tekst.GetLength() - pos -1);
592 smscount.Remove(':');
593 ResetSms++;
594 }
595 ////////////////Read sms ting//////////////////
596 std::vector<unsigned char> data;
597 data.push_back('a');
598 data.push_back('t');
599 data.push_back('+');
600 data.push_back('c');
601 data.push_back('m');
602 data.push_back('g');
603 data.push_back('r');
604 data.push_back('=');
605
606 for (int i=0; i< smscount.GetLength(); i++)
607 {
608 data.push_back(smscount[i]);
609 }
610 m_Textwindow.GetWindowText(oldteskst);
611 oldteskst.Append("\r\n");
612 for (int i=0; i<data.size();i++)
613 {
614 oldteskst.AppendChar(data[i]);
615 }
616 m_Textwindow.SetWindowText(oldteskst);
617 writeFrame(data);
618 Sleep(200);
619 ReadSms();
620 ResetSms++;
621
622 }
623 else if(command.MakeLower() == "wind")
624 {
625
626 CString send;
627 send.Append("Wind modtaget");
628 send.Append("\r\n");
629 send.Append(tekst);
630 AppendText(send);
631 }
632 }
633 else
634 {
635 AppendText(tekst);
636 }
637 if(ResetSms == 20)
638 {
639 DeleteSms();
640 AppendText("Sms'er slettet da vi nåede grænsen");
641 }
642
643 }
644 if (continueThread == 1)
645 {
646
647 CString testdata, dataframe,testprint, sIDnr, sCommandID, sInstallationsID, sImei;
648 int commandtest = 0;
649 int iAll = 1;
650 std::vector<Commands> data;
651 data = DBReadCommands();
652 for (int i=0; i<data.size(); i++)
653 {
654 sIDnr = data[i].IDnr;
655 sCommandID = data[i].CommandID;
656 commandtest = atoi(data[i].CommandID);
657 sInstallationsID = "0";
658
659 if(commandtest > 1)
660 {
661 sInstallationsID = data[i].InstallationsID;
662 }
663 }
664
665 if (commandtest > 1)
666 {
667 iAll = 0;
668 }
669
670 if (sIDnr.GetLength() > 0)
671 {
672 SendConfig(sIDnr,sCommandID,sInstallationsID);
673 }
674 Sleep(500);
675
676 CheckAcknowledges();
677 Sleep(500);
678 }
679 CTime now = CTime::GetCurrentTime();
680
681 CTimeSpan elapsed = now-Alive.tid;
682
683 if (elapsed.GetTotalSeconds() >= 900)
684 {
685 keepaliveandread();
686 }
687 }
688 void CFlisServerDlg::SendConfig(CString IDnr,CString CommandID,CString InstallationsID)
689 {
690
691 std::vector<Installation> inst;
692
693 if (CommandID == "1")
694 inst = DBReadPhone("0");
695 else
696 inst = DBReadPhone(InstallationsID);
697
698 for ( int j=0; j < inst.size(); j++)
699 {
700 CString TlfNr, Imei, updaterate;
701 TlfNr.Empty();
702 Imei.Empty();
703 updaterate.Empty();
704
705 CString dataen = inst[j].InstPhoneNr;
706 TlfNr.Append(dataen);
707 CString Imeidata = inst[j].Imei;
708 Imei.Append(Imeidata);
709 CString updaterat = inst[j].Updaterate;
710 updaterate.Append(updaterat);
711
712 vector<unsigned char> tlfnr;
713 for (int i=0; i<TlfNr.GetLength(); i++)
714 {
715 tlfnr.push_back(TlfNr[i]);
716 }
717
718 int calcimei;
719 __int64 buf;
720
721 buf = atof(Imei);
722
723 calcimei = tversum(buf);
724
725 Imei.Format("%d",calcimei);
726
727 SendSmsHead(tlfnr);
728 Sleep(250);
729
730 vector<unsigned char> smsdata;
731
732 for (int i=0; i<Imei.GetLength(); i++)
733 {
734 smsdata.push_back(Imei[i]);
735 }
736 smsdata.push_back(':');
737 for (int i=0; i<Alive.Phonenr.GetLength(); i++)
738 {
739 smsdata.push_back(Alive.Phonenr[i]);
740 }
741 smsdata.push_back(':');
742 for (int i=0; i<updaterate.GetLength(); i++)
743 {
744 smsdata.push_back(updaterate[i]);
745 }
746
747 SendSmsData(smsdata);
748 Sleep(500);
749
750 if (IDnr != "0")
751 {
752 Acks.push_back( Acknowledge(inst[j].instID,TlfNr) );
753 }
754
755 }
756
757 if (IDnr != "0")
758 {
759 CString SQL, Textwindow;
760 SQL.Format("update command set executed=now() where id=%s",IDnr);
761 db.ExecuteSQL(SQL);
762 Sleep(100);
763 AppendText("Command executed");
764 }
765 Sleep(150);
766
767
768
769
770 }
771 vector<Installation> CFlisServerDlg::DBReadPhone(CString sInstallationsID)
772 {
773 vector<Installation> buffer;
774
775 CString SQL, phonenr, imei, updaterate, id;
776 Installation Myinst;
777
778 if (sInstallationsID != "0")
779 {
780 SQL.Format("select installationphonenr, imei, updaterate, id from installation WHERE id = %s", sInstallationsID);
781 }
782 else
783 {
784 SQL.Format("select installationphonenr, imei, updaterate, id from installation");
785 }
786
787 CRecordset rs(&db);
788 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
789 if (rs.GetRecordCount()>0)
790 {
791 rs.MoveFirst();
792 while(!rs.IsEOF())
793 {
794
795 rs.GetFieldValue((short)0,phonenr);
796 rs.GetFieldValue(1,imei);
797 rs.GetFieldValue(2,updaterate);
798 rs.GetFieldValue(3,id);
799
800 Myinst.InstPhoneNr = phonenr;
801 Myinst.Imei = imei;
802 Myinst.Updaterate = updaterate;
803 Myinst.instID = id;
804
805 buffer.push_back(Myinst);
806 rs.MoveNext();
807 }
808 }
809 rs.Close();
810 return buffer;
811 }
812 int CFlisServerDlg::tversum(__int64 input)
813 {
814 int sum = 0;
815 while (input > 0)
816 {
817 sum += (input %10);
818 input /= 10;
819 }
820 return sum;
821 }
822 void CFlisServerDlg::OnBnClickedStart()
823 {
824 // TODO: Add your control notification handler code here
825
826 continueThread = 1;
827 keepaliveandread();
828 Sleep(150);
829 m_Textwindow.SetWindowText(CString("Server phonenr read from db: ") + Alive.Phonenr );
830 AppendText("Started");
831 AfxBeginThread(threadWrapper,AfxGetMainWnd());
832 }
833 void CFlisServerDlg::AppendText(CString s)
834 {
835 CString Tekst;
836 m_Textwindow.GetWindowText(Tekst);
837 Tekst.Append("\r\n");
838 Tekst.Append(s);
839 m_Textwindow.SetWindowText(Tekst);
840
841 }
842 void ConfigFile::ReadSettings()
843 {
844 ifstream file("Server-Settings.ini");
845 if (!file.is_open())
846 throw("Could not open file");
847
848 char buf[200];
849 while (!file.eof() ) {
850 file.getline(buf,200);
851 CString tmp(buf);
852
853 if (tmp.GetAt(0) == '#')
854 continue;
855
856 int pos = tmp.Find('=');
857 if (pos>0) {
858 CString key = tmp.Left(pos).Trim().MakeLower();;
859 CString value = tmp.Right(tmp.GetLength()-pos-1).Trim();
860
861 if (key == "host")
862 host = value;
863 else if (key == "username")
864 username = value;
865 else if (key == "password")
866 password = value;
867 else if (key == "database")
868 database = value;
869 else if (key == "comport")
870 comport = value;
871 }
872
873 }
874
875 file.close();
876 }
877 void CFlisServerDlg::HandleAcknowledge(CString tlfnr)
878 {
879 for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
880 {
881 Acknowledge& current = (*it);
882 if (current.sTlfNr == tlfnr)
883 {
884 CString SQL;
885 SQL.Format("UPDATE installation SET commerror = false WHERE id = %s", current.sInstallationID);
886 db.ExecuteSQL(SQL);
887
888 Acks.erase(it);
889
890 return;
891 }
892 }
893 }
894
895 void CFlisServerDlg::CheckAcknowledges()
896 {
897 CTime now = CTime::GetCurrentTime();
898 for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
899 {
900 Acknowledge& current = (*it);
901
902 CTimeSpan elapsed = now-current.cTime;
903
904 if (elapsed.GetTotalSeconds() >= 300)
905 {
906 DumpAckList();
907 if (current.iRetry >= 1)
908 {
909 CString SQL;
910 SQL.Format("UPDATE installation SET commerror = true WHERE id = %s", current.sInstallationID);
911 db.ExecuteSQL(SQL);
912 Acks.erase(it);
913 return; // the iterator is now invalidated, but the thread loop will make sure we are here soon again
914 }
915 else
916 {
917 SendConfig("0","2",current.sInstallationID);
918 current.iRetry++;
919 current.cTime = CTime::GetCurrentTime();
920 AppendText( CString("Retry send config to ") + current.sTlfNr );
921 }
922 }
923 }
924 }
925
926 void CFlisServerDlg::DumpAckList()
927 {
928 CTime now = CTime::GetCurrentTime();
929 OutputDebugString("-------------------------------\n");
930 int count = 0;
931 for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
932 {
933 CString msg;
934 msg.Format("%d:%d:%d> %4d : %s\n", now.GetHour(), now.GetMinute(), now.GetSecond(), count, (*it).sTlfNr);
935 OutputDebugString(msg);
936 count++;
937 }
938 }
939 vector<keepalive> CFlisServerDlg::keepaliveandread(void)
940 {
941 vector<keepalive> buffer;
942
943 CString SQL, name, value;
944 SQL = "select name, value from config;";
945 CRecordset rs(&db);
946 try
947 {
948 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
949 if (rs.GetRecordCount()>0)
950 {
951 rs.MoveFirst();
952
953 rs.GetFieldValue((short)0, name);
954 rs.GetFieldValue(1,value);
955
956 Alive.name = name;
957 Alive.value = value;
958 Alive.tid = CTime::GetCurrentTime();
959 if(Alive.name == "phonenr")
960 {
961 Alive.Phonenr = value;
962 }
963
964 buffer.push_back(Alive);
965 rs.MoveNext();
966
967 }
968 rs.Close();
969 return buffer;
970 }
971 catch (char * str)
972 {
973 AppendText("Keepalive failed, closing and opening the db connection again");
974 if(db.IsOpen())
975 {
976 db.Close();
977 AppendText("DB connection closed");
978 }
979 if(!db.IsOpen())
980 {
981 DBConnect();
982 AppendText("DB connection started again");
983 }
984 }
985
986
987 }

  ViewVC Help
Powered by ViewVC 1.1.20