yocto_messagebox.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  *
3  * $Id: yocto_messagebox.cpp 28753 2017-10-03 11:23:38Z seb $
4  *
5  * Implements yFindMessageBox(), the high-level API for MessageBox functions
6  *
7  * - - - - - - - - - License information: - - - - - - - - -
8  *
9  * Copyright (C) 2011 and beyond by Yoctopuce Sarl, Switzerland.
10  *
11  * Yoctopuce Sarl (hereafter Licensor) grants to you a perpetual
12  * non-exclusive license to use, modify, copy and integrate this
13  * file into your software for the sole purpose of interfacing
14  * with Yoctopuce products.
15  *
16  * You may reproduce and distribute copies of this file in
17  * source or object form, as long as the sole purpose of this
18  * code is to interface with Yoctopuce products. You must retain
19  * this notice in the distributed source file.
20  *
21  * You should refer to Yoctopuce General Terms and Conditions
22  * for additional information regarding your rights and
23  * obligations.
24  *
25  * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED 'AS IS' WITHOUT
26  * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
27  * WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS
28  * FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO
29  * EVENT SHALL LICENSOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL,
30  * INDIRECT OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA,
31  * COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR
32  * SERVICES, ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT
33  * LIMITED TO ANY DEFENSE THEREOF), ANY CLAIMS FOR INDEMNITY OR
34  * CONTRIBUTION, OR OTHER SIMILAR COSTS, WHETHER ASSERTED ON THE
35  * BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF
36  * WARRANTY, OR OTHERWISE.
37  *
38  *********************************************************************/
39 
40 
41 #define _CRT_SECURE_NO_DEPRECATE //do not use windows secure crt
42 #include "yocto_messagebox.h"
43 #include "yapi/yjson.h"
44 #include "yapi/yapi.h"
45 #include <string.h>
46 #include <stdio.h>
47 #include <math.h>
48 #include <stdlib.h>
49 #include <iostream>
50 #define __FILE_ID__ "messagebox"
51 
52 
53 YSms::YSms(void):
54 //--- (generated code: YSms initialization)
55  _mbox(NULL)
56  ,_slot(0)
57  ,_deliv(0)
58  ,_mref(0)
59  ,_pid(0)
60  ,_alphab(0)
61  ,_mclass(0)
62  ,_npdu(0)
63  ,_aggIdx(0)
64  ,_aggCnt(0)
65 //--- (end of generated code: YSms initialization)
66 { }
67 
69 //--- (generated code: YSms initialization)
70  _mbox(NULL)
71  ,_slot(0)
72  ,_deliv(0)
73  ,_mref(0)
74  ,_pid(0)
75  ,_alphab(0)
76  ,_mclass(0)
77  ,_npdu(0)
78  ,_aggIdx(0)
79  ,_aggCnt(0)
80 //--- (end of generated code: YSms initialization)
81 {
82  _mbox = mbox;
83 }
84 
85 //--- (generated code: YSms implementation)
86 // static attributes
87 
88 
89 int YSms::get_slot(void)
90 {
91  return _slot;
92 }
93 
94 string YSms::get_smsc(void)
95 {
96  return _smsc;
97 }
98 
100 {
101  return _mref;
102 }
103 
104 string YSms::get_sender(void)
105 {
106  return _orig;
107 }
108 
110 {
111  return _dest;
112 }
113 
115 {
116  return _pid;
117 }
118 
120 {
121  return _deliv;
122 }
123 
125 {
126  return _alphab;
127 }
128 
130 {
131  if (((_mclass) & (16)) == 0) {
132  return -1;
133  }
134  return ((_mclass) & (3));
135 }
136 
137 int YSms::get_dcs(void)
138 {
139  return ((_mclass) | ((((_alphab) << (2)))));
140 }
141 
143 {
144  return _stamp;
145 }
146 
148 {
149  return _udh;
150 }
151 
152 string YSms::get_userData(void)
153 {
154  return _udata;
155 }
156 
157 string YSms::get_textData(void)
158 {
159  string isolatin;
160  int isosize = 0;
161  int i = 0;
162  if (_alphab == 0) {
163  // using GSM standard 7-bit alphabet
164  return _mbox->gsm2str(_udata);
165  }
166  if (_alphab == 2) {
167  // using UCS-2 alphabet
168  isosize = (((int)(_udata).size()) >> (1));
169  isolatin = string(isosize, (char)0);
170  i = 0;
171  while (i < isosize) {
172  isolatin[i] = (char)(((u8)_udata[2*i+1]));
173  i = i + 1;
174  }
175  return isolatin;
176  }
177  // default: convert 8 bit to string as-is
178  return _udata;
179 }
180 
181 vector<int> YSms::get_unicodeData(void)
182 {
183  vector<int> res;
184  int unisize = 0;
185  int unival = 0;
186  int i = 0;
187  if (_alphab == 0) {
188  // using GSM standard 7-bit alphabet
189  return _mbox->gsm2unicode(_udata);
190  }
191  if (_alphab == 2) {
192  // using UCS-2 alphabet
193  unisize = (((int)(_udata).size()) >> (1));
194  res.clear();
195  i = 0;
196  while (i < unisize) {
197  unival = 256*((u8)_udata[2*i])+((u8)_udata[2*i+1]);
198  res.push_back(unival);
199  i = i + 1;
200  }
201  } else {
202  // return straight 8-bit values
203  unisize = (int)(_udata).size();
204  res.clear();
205  i = 0;
206  while (i < unisize) {
207  res.push_back(((u8)_udata[i])+0);
208  i = i + 1;
209  }
210  }
211  return res;
212 }
213 
215 {
216  if (_npdu == 0) {
217  this->generatePdu();
218  }
219  return _npdu;
220 }
221 
222 string YSms::get_pdu(void)
223 {
224  if (_npdu == 0) {
225  this->generatePdu();
226  }
227  return _pdu;
228 }
229 
230 vector<YSms> YSms::get_parts(void)
231 {
232  if (_npdu == 0) {
233  this->generatePdu();
234  }
235  return _parts;
236 }
237 
239 {
240  if (_npdu == 0) {
241  this->generatePdu();
242  }
243  return _aggSig;
244 }
245 
247 {
248  if (_npdu == 0) {
249  this->generatePdu();
250  }
251  return _aggIdx;
252 }
253 
255 {
256  if (_npdu == 0) {
257  this->generatePdu();
258  }
259  return _aggCnt;
260 }
261 
262 int YSms::set_slot(int val)
263 {
264  _slot = val;
265  return YAPI_SUCCESS;
266 }
267 
268 int YSms::set_received(bool val)
269 {
270  _deliv = val;
271  return YAPI_SUCCESS;
272 }
273 
274 int YSms::set_smsc(string val)
275 {
276  _smsc = val;
277  _npdu = 0;
278  return YAPI_SUCCESS;
279 }
280 
281 int YSms::set_msgRef(int val)
282 {
283  _mref = val;
284  _npdu = 0;
285  return YAPI_SUCCESS;
286 }
287 
288 int YSms::set_sender(string val)
289 {
290  _orig = val;
291  _npdu = 0;
292  return YAPI_SUCCESS;
293 }
294 
295 int YSms::set_recipient(string val)
296 {
297  _dest = val;
298  _npdu = 0;
299  return YAPI_SUCCESS;
300 }
301 
303 {
304  _pid = val;
305  _npdu = 0;
306  return YAPI_SUCCESS;
307 }
308 
309 int YSms::set_alphabet(int val)
310 {
311  _alphab = val;
312  _npdu = 0;
313  return YAPI_SUCCESS;
314 }
315 
316 int YSms::set_msgClass(int val)
317 {
318  if (val == -1) {
319  _mclass = 0;
320  } else {
321  _mclass = 16+val;
322  }
323  _npdu = 0;
324  return YAPI_SUCCESS;
325 }
326 
327 int YSms::set_dcs(int val)
328 {
329  _alphab = (((((val) >> (2)))) & (3));
330  _mclass = ((val) & (16+3));
331  _npdu = 0;
332  return YAPI_SUCCESS;
333 }
334 
335 int YSms::set_timestamp(string val)
336 {
337  _stamp = val;
338  _npdu = 0;
339  return YAPI_SUCCESS;
340 }
341 
343 {
344  _udh = val;
345  _npdu = 0;
346  this->parseUserDataHeader();
347  return YAPI_SUCCESS;
348 }
349 
350 int YSms::set_userData(string val)
351 {
352  _udata = val;
353  _npdu = 0;
354  return YAPI_SUCCESS;
355 }
356 
358 {
359  vector<int> ucs2;
360  int udatalen = 0;
361  int i = 0;
362  int uni = 0;
363  if (_alphab == 2) {
364  return YAPI_SUCCESS;
365  }
366  if (_alphab == 0) {
367  ucs2 = _mbox->gsm2unicode(_udata);
368  } else {
369  udatalen = (int)(_udata).size();
370  ucs2.clear();
371  i = 0;
372  while (i < udatalen) {
373  uni = ((u8)_udata[i]);
374  ucs2.push_back(uni);
375  i = i + 1;
376  }
377  }
378  _alphab = 2;
379  _udata = string(0, (char)0);
380  this->addUnicodeData(ucs2);
381  return YAPI_SUCCESS;
382 }
383 
384 int YSms::addText(string val)
385 {
386  string udata;
387  int udatalen = 0;
388  string newdata;
389  int newdatalen = 0;
390  int i = 0;
391  if ((int)(val).length() == 0) {
392  return YAPI_SUCCESS;
393  }
394  if (_alphab == 0) {
395  // Try to append using GSM 7-bit alphabet
396  newdata = _mbox->str2gsm(val);
397  newdatalen = (int)(newdata).size();
398  if (newdatalen == 0) {
399  // 7-bit not possible, switch to unicode
400  this->convertToUnicode();
401  newdata = val;
402  newdatalen = (int)(newdata).size();
403  }
404  } else {
405  newdata = val;
406  newdatalen = (int)(newdata).size();
407  }
408  udatalen = (int)(_udata).size();
409  if (_alphab == 2) {
410  // Append in unicode directly
411  udata = string(udatalen + 2*newdatalen, (char)0);
412  i = 0;
413  while (i < udatalen) {
414  udata[i] = (char)(((u8)_udata[i]));
415  i = i + 1;
416  }
417  i = 0;
418  while (i < newdatalen) {
419  udata[udatalen+1] = (char)(((u8)newdata[i]));
420  udatalen = udatalen + 2;
421  i = i + 1;
422  }
423  } else {
424  // Append binary buffers
425  udata = string(udatalen+newdatalen, (char)0);
426  i = 0;
427  while (i < udatalen) {
428  udata[i] = (char)(((u8)_udata[i]));
429  i = i + 1;
430  }
431  i = 0;
432  while (i < newdatalen) {
433  udata[udatalen] = (char)(((u8)newdata[i]));
434  udatalen = udatalen + 1;
435  i = i + 1;
436  }
437  }
438  return this->set_userData(udata);
439 }
440 
441 int YSms::addUnicodeData(vector<int> val)
442 {
443  int arrlen = 0;
444  int newdatalen = 0;
445  int i = 0;
446  int uni = 0;
447  string udata;
448  int udatalen = 0;
449  int surrogate = 0;
450  if (_alphab != 2) {
451  this->convertToUnicode();
452  }
453  // compute number of 16-bit code units
454  arrlen = (int)val.size();
455  newdatalen = arrlen;
456  i = 0;
457  while (i < arrlen) {
458  uni = val[i];
459  if (uni > 65535) {
460  newdatalen = newdatalen + 1;
461  }
462  i = i + 1;
463  }
464  // now build utf-16 buffer
465  udatalen = (int)(_udata).size();
466  udata = string(udatalen+2*newdatalen, (char)0);
467  i = 0;
468  while (i < udatalen) {
469  udata[i] = (char)(((u8)_udata[i]));
470  i = i + 1;
471  }
472  i = 0;
473  while (i < arrlen) {
474  uni = val[i];
475  if (uni >= 65536) {
476  surrogate = uni - 65536;
477  uni = (((((surrogate) >> (10))) & (1023))) + 55296;
478  udata[udatalen] = (char)(((uni) >> (8)));
479  udata[udatalen+1] = (char)(((uni) & (255)));
480  udatalen = udatalen + 2;
481  uni = (((surrogate) & (1023))) + 56320;
482  }
483  udata[udatalen] = (char)(((uni) >> (8)));
484  udata[udatalen+1] = (char)(((uni) & (255)));
485  udatalen = udatalen + 2;
486  i = i + 1;
487  }
488  return this->set_userData(udata);
489 }
490 
491 int YSms::set_pdu(string pdu)
492 {
493  _pdu = pdu;
494  _npdu = 1;
495  return this->parsePdu(pdu);
496 }
497 
498 int YSms::set_parts(vector<YSms> parts)
499 {
500  vector<YSms> sorted;
501  int partno = 0;
502  int initpartno = 0;
503  int i = 0;
504  int retcode = 0;
505  int totsize = 0;
506  YSms subsms;
507  string subdata;
508  string res;
509  _npdu = (int)parts.size();
510  if (_npdu == 0) {
511  return YAPI_INVALID_ARGUMENT;
512  }
513  sorted.clear();
514  partno = 0;
515  while (partno < _npdu) {
516  initpartno = partno;
517  i = 0;
518  while (i < _npdu) {
519  subsms = parts[i];
520  if (subsms.get_concatIndex() == partno) {
521  sorted.push_back(subsms);
522  partno = partno + 1;
523  }
524  i = i + 1;
525  }
526  if (initpartno == partno) {
527  partno = partno + 1;
528  }
529  }
530  _parts = sorted;
531  _npdu = (int)sorted.size();
532  // inherit header fields from first part
533  subsms = _parts[0];
534  retcode = this->parsePdu(subsms.get_pdu());
535  if (retcode != YAPI_SUCCESS) {
536  return retcode;
537  }
538  // concatenate user data from all parts
539  totsize = 0;
540  partno = 0;
541  while (partno < (int)_parts.size()) {
542  subsms = _parts[partno];
543  subdata = subsms.get_userData();
544  totsize = totsize + (int)(subdata).size();
545  partno = partno + 1;
546  }
547  res = string(totsize, (char)0);
548  totsize = 0;
549  partno = 0;
550  while (partno < (int)_parts.size()) {
551  subsms = _parts[partno];
552  subdata = subsms.get_userData();
553  i = 0;
554  while (i < (int)(subdata).size()) {
555  res[totsize] = (char)(((u8)subdata[i]));
556  totsize = totsize + 1;
557  i = i + 1;
558  }
559  partno = partno + 1;
560  }
561  _udata = res;
562  return YAPI_SUCCESS;
563 }
564 
565 string YSms::encodeAddress(string addr)
566 {
567  string bytes;
568  int srclen = 0;
569  int numlen = 0;
570  int i = 0;
571  int val = 0;
572  int digit = 0;
573  string res;
574  bytes = addr;
575  srclen = (int)(bytes).size();
576  numlen = 0;
577  i = 0;
578  while (i < srclen) {
579  val = ((u8)bytes[i]);
580  if ((val >= 48) && (val < 58)) {
581  numlen = numlen + 1;
582  }
583  i = i + 1;
584  }
585  if (numlen == 0) {
586  res = string(1, (char)0);
587  res[0] = (char)(0);
588  return res;
589  }
590  res = string(2+((numlen+1) >> (1)), (char)0);
591  res[0] = (char)(numlen);
592  if (((u8)bytes[0]) == 43) {
593  res[1] = (char)(145);
594  } else {
595  res[1] = (char)(129);
596  }
597  numlen = 4;
598  digit = 0;
599  i = 0;
600  while (i < srclen) {
601  val = ((u8)bytes[i]);
602  if ((val >= 48) && (val < 58)) {
603  if (((numlen) & (1)) == 0) {
604  digit = val - 48;
605  } else {
606  res[((numlen) >> (1))] = (char)(digit + 16*(val-48));
607  }
608  numlen = numlen + 1;
609  }
610  i = i + 1;
611  }
612  // pad with F if needed
613  if (((numlen) & (1)) != 0) {
614  res[((numlen) >> (1))] = (char)(digit + 240);
615  }
616  return res;
617 }
618 
619 string YSms::decodeAddress(string addr,int ofs,int siz)
620 {
621  int addrType = 0;
622  string gsm7;
623  string res;
624  int i = 0;
625  int rpos = 0;
626  int carry = 0;
627  int nbits = 0;
628  int byt = 0;
629  if (siz == 0) {
630  return "";
631  }
632  res = "";
633  addrType = ((((u8)addr[ofs])) & (112));
634  if (addrType == 80) {
635  // alphanumeric number
636  siz = ((4*siz) / (7));
637  gsm7 = string(siz, (char)0);
638  rpos = 1;
639  carry = 0;
640  nbits = 0;
641  i = 0;
642  while (i < siz) {
643  if (nbits == 7) {
644  gsm7[i] = (char)(carry);
645  carry = 0;
646  nbits = 0;
647  } else {
648  byt = ((u8)addr[ofs+rpos]);
649  rpos = rpos + 1;
650  gsm7[i] = (char)(((carry) | ((((((byt) << (nbits)))) & (127)))));
651  carry = ((byt) >> ((7 - nbits)));
652  nbits = nbits + 1;
653  }
654  i = i + 1;
655  }
656  return _mbox->gsm2str(gsm7);
657  } else {
658  // standard phone number
659  if (addrType == 16) {
660  res = "+";
661  }
662  siz = (((siz+1)) >> (1));
663  i = 0;
664  while (i < siz) {
665  byt = ((u8)addr[ofs+i+1]);
666  res = YapiWrapper::ysprintf("%s%x%x", res.c_str(), ((byt) & (15)),((byt) >> (4)));
667  i = i + 1;
668  }
669  // remove padding digit if needed
670  if (((((u8)addr[ofs+siz])) >> (4)) == 15) {
671  res = (res).substr( 0, (int)(res).length()-1);
672  }
673  return res;
674  }
675 }
676 
677 string YSms::encodeTimeStamp(string exp)
678 {
679  int explen = 0;
680  int i = 0;
681  string res;
682  int n = 0;
683  string expasc;
684  int v1 = 0;
685  int v2 = 0;
686  explen = (int)(exp).length();
687  if (explen == 0) {
688  res = string(0, (char)0);
689  return res;
690  }
691  if ((exp).substr(0, 1) == "+") {
692  n = atoi(((exp).substr(1, explen-1)).c_str());
693  res = string(1, (char)0);
694  if (n > 30*86400) {
695  n = 192+(((n+6*86400)) / ((7*86400)));
696  } else {
697  if (n > 86400) {
698  n = 166+(((n+86399)) / (86400));
699  } else {
700  if (n > 43200) {
701  n = 143+(((n-43200+1799)) / (1800));
702  } else {
703  n = -1+(((n+299)) / (300));
704  }
705  }
706  }
707  if (n < 0) {
708  n = 0;
709  }
710  res[0] = (char)(n);
711  return res;
712  }
713  if ((exp).substr(4, 1) == "-" || (exp).substr(4, 1) == "/") {
714  // ignore century
715  exp = (exp).substr( 2, explen-2);
716  explen = (int)(exp).length();
717  }
718  expasc = exp;
719  res = string(7, (char)0);
720  n = 0;
721  i = 0;
722  while ((i+1 < explen) && (n < 7)) {
723  v1 = ((u8)expasc[i]);
724  if ((v1 >= 48) && (v1 < 58)) {
725  v2 = ((u8)expasc[i+1]);
726  if ((v2 >= 48) && (v2 < 58)) {
727  v1 = v1 - 48;
728  v2 = v2 - 48;
729  res[n] = (char)((((v2) << (4))) + v1);
730  n = n + 1;
731  i = i + 1;
732  }
733  }
734  i = i + 1;
735  }
736  while (n < 7) {
737  res[n] = (char)(0);
738  n = n + 1;
739  }
740  if (i+2 < explen) {
741  // convert for timezone in cleartext ISO format +/-nn:nn
742  v1 = ((u8)expasc[i-3]);
743  v2 = ((u8)expasc[i]);
744  if (((v1 == 43) || (v1 == 45)) && (v2 == 58)) {
745  v1 = ((u8)expasc[i+1]);
746  v2 = ((u8)expasc[i+2]);
747  if ((v1 >= 48) && (v1 < 58) && (v1 >= 48) && (v1 < 58)) {
748  v1 = (((10*(v1 - 48)+(v2 - 48))) / (15));
749  n = n - 1;
750  v2 = 4 * ((u8)res[n]) + v1;
751  if (((u8)expasc[i-3]) == 45) {
752  v2 += 128;
753  }
754  res[n] = (char)(v2);
755  }
756  }
757  }
758  return res;
759 }
760 
761 string YSms::decodeTimeStamp(string exp,int ofs,int siz)
762 {
763  int n = 0;
764  string res;
765  int i = 0;
766  int byt = 0;
767  string sign;
768  string hh;
769  string ss;
770  if (siz < 1) {
771  return "";
772  }
773  if (siz == 1) {
774  n = ((u8)exp[ofs]);
775  if (n < 144) {
776  n = n * 300;
777  } else {
778  if (n < 168) {
779  n = (n-143) * 1800;
780  } else {
781  if (n < 197) {
782  n = (n-166) * 86400;
783  } else {
784  n = (n-192) * 7 * 86400;
785  }
786  }
787  }
788  return YapiWrapper::ysprintf("+%d",n);
789  }
790  res = "20";
791  i = 0;
792  while ((i < siz) && (i < 6)) {
793  byt = ((u8)exp[ofs+i]);
794  res = YapiWrapper::ysprintf("%s%x%x", res.c_str(), ((byt) & (15)),((byt) >> (4)));
795  if (i < 3) {
796  if (i < 2) {
797  res = YapiWrapper::ysprintf("%s-",res.c_str());
798  } else {
799  res = YapiWrapper::ysprintf("%s ",res.c_str());
800  }
801  } else {
802  if (i < 5) {
803  res = YapiWrapper::ysprintf("%s:",res.c_str());
804  }
805  }
806  i = i + 1;
807  }
808  if (siz == 7) {
809  byt = ((u8)exp[ofs+i]);
810  sign = "+";
811  if (((byt) & (8)) != 0) {
812  byt = byt - 8;
813  sign = "-";
814  }
815  byt = (10*(((byt) & (15)))) + (((byt) >> (4)));
816  hh = YapiWrapper::ysprintf("%d",((byt) >> (2)));
817  ss = YapiWrapper::ysprintf("%d",15*(((byt) & (3))));
818  if ((int)(hh).length()<2) {
819  hh = YapiWrapper::ysprintf("0%s",hh.c_str());
820  }
821  if ((int)(ss).length()<2) {
822  ss = YapiWrapper::ysprintf("0%s",ss.c_str());
823  }
824  res = YapiWrapper::ysprintf("%s%s%s:%s", res.c_str(), sign.c_str(), hh.c_str(),ss.c_str());
825  }
826  return res;
827 }
828 
830 {
831  int res = 0;
832  int udhsize = 0;
833  udhsize = (int)(_udh).size();
834  res = (int)(_udata).size();
835  if (_alphab == 0) {
836  if (udhsize > 0) {
837  res = res + (((8 + 8*udhsize + 6)) / (7));
838  }
839  res = (((res * 7 + 7)) / (8));
840  } else {
841  if (udhsize > 0) {
842  res = res + 1 + udhsize;
843  }
844  }
845  return res;
846 }
847 
849 {
850  int udsize = 0;
851  int udlen = 0;
852  int udhsize = 0;
853  int udhlen = 0;
854  string res;
855  int i = 0;
856  int wpos = 0;
857  int carry = 0;
858  int nbits = 0;
859  int thi_b = 0;
860  // nbits = number of bits in carry
861  udsize = this->udataSize();
862  udhsize = (int)(_udh).size();
863  udlen = (int)(_udata).size();
864  res = string(1+udsize, (char)0);
865  udhlen = 0;
866  nbits = 0;
867  carry = 0;
868  // 1. Encode UDL
869  if (_alphab == 0) {
870  // 7-bit encoding
871  if (udhsize > 0) {
872  udhlen = (((8 + 8*udhsize + 6)) / (7));
873  nbits = 7*udhlen - 8 - 8*udhsize;
874  }
875  res[0] = (char)(udhlen+udlen);
876  } else {
877  // 8-bit encoding
878  res[0] = (char)(udsize);
879  }
880  // 2. Encode UDHL and UDL
881  wpos = 1;
882  if (udhsize > 0) {
883  res[wpos] = (char)(udhsize);
884  wpos = wpos + 1;
885  i = 0;
886  while (i < udhsize) {
887  res[wpos] = (char)(((u8)_udh[i]));
888  wpos = wpos + 1;
889  i = i + 1;
890  }
891  }
892  // 3. Encode UD
893  if (_alphab == 0) {
894  // 7-bit encoding
895  i = 0;
896  while (i < udlen) {
897  if (nbits == 0) {
898  carry = ((u8)_udata[i]);
899  nbits = 7;
900  } else {
901  thi_b = ((u8)_udata[i]);
902  res[wpos] = (char)(((carry) | ((((((thi_b) << (nbits)))) & (255)))));
903  wpos = wpos + 1;
904  nbits = nbits - 1;
905  carry = ((thi_b) >> ((7 - nbits)));
906  }
907  i = i + 1;
908  }
909  if (nbits > 0) {
910  res[wpos] = (char)(carry);
911  }
912  } else {
913  // 8-bit encoding
914  i = 0;
915  while (i < udlen) {
916  res[wpos] = (char)(((u8)_udata[i]));
917  wpos = wpos + 1;
918  i = i + 1;
919  }
920  }
921  return res;
922 }
923 
925 {
926  int udhsize = 0;
927  int udlen = 0;
928  int mss = 0;
929  int partno = 0;
930  int partlen = 0;
931  string newud;
932  string newudh;
933  YSms newpdu;
934  int i = 0;
935  int wpos = 0;
936  udhsize = (int)(_udh).size();
937  udlen = (int)(_udata).size();
938  mss = 140 - 1 - 5 - udhsize;
939  if (_alphab == 0) {
940  mss = (((mss * 8 - 6)) / (7));
941  }
942  _npdu = (((udlen+mss-1)) / (mss));
943  _parts.clear();
944  partno = 0;
945  wpos = 0;
946  while (wpos < udlen) {
947  partno = partno + 1;
948  newudh = string(5+udhsize, (char)0);
949  newudh[0] = (char)(0); // IEI: concatenated message
950  newudh[1] = (char)(3); // IEDL: 3 bytes
951  newudh[2] = (char)(_mref);
952  newudh[3] = (char)(_npdu);
953  newudh[4] = (char)(partno);
954  i = 0;
955  while (i < udhsize) {
956  newudh[5+i] = (char)(((u8)_udh[i]));
957  i = i + 1;
958  }
959  if (wpos+mss < udlen) {
960  partlen = mss;
961  } else {
962  partlen = udlen-wpos;
963  }
964  newud = string(partlen, (char)0);
965  i = 0;
966  while (i < partlen) {
967  newud[i] = (char)(((u8)_udata[wpos]));
968  wpos = wpos + 1;
969  i = i + 1;
970  }
971  newpdu = YSms(_mbox);
972  newpdu.set_received(this->isReceived());
973  newpdu.set_smsc(this->get_smsc());
974  newpdu.set_msgRef(this->get_msgRef());
975  newpdu.set_sender(this->get_sender());
976  newpdu.set_recipient(this->get_recipient());
977  newpdu.set_protocolId(this->get_protocolId());
978  newpdu.set_dcs(this->get_dcs());
979  newpdu.set_timestamp(this->get_timestamp());
980  newpdu.set_userDataHeader(newudh);
981  newpdu.set_userData(newud);
982  _parts.push_back(newpdu);
983  }
984  return YAPI_SUCCESS;
985 }
986 
988 {
989  string sca;
990  string hdr;
991  string addr;
992  string stamp;
993  string udata;
994  int pdutyp = 0;
995  int pdulen = 0;
996  int i = 0;
997  // Determine if the message can fit within a single PDU
998  _parts.clear();
999  if (this->udataSize() > 140) {
1000  // multiple PDU are needed
1001  _pdu = string(0, (char)0);
1002  return this->generateParts();
1003  }
1004  sca = this->encodeAddress(_smsc);
1005  if ((int)(sca).size() > 0) {
1006  sca[0] = (char)((int)(sca).size()-1);
1007  }
1008  stamp = this->encodeTimeStamp(_stamp);
1009  udata = this->encodeUserData();
1010  if (_deliv) {
1011  addr = this->encodeAddress(_orig);
1012  hdr = string(1, (char)0);
1013  pdutyp = 0;
1014  } else {
1015  addr = this->encodeAddress(_dest);
1016  _mref = _mbox->nextMsgRef();
1017  hdr = string(2, (char)0);
1018  hdr[1] = (char)(_mref);
1019  pdutyp = 1;
1020  if ((int)(stamp).size() > 0) {
1021  pdutyp = pdutyp + 16;
1022  }
1023  if ((int)(stamp).size() == 7) {
1024  pdutyp = pdutyp + 8;
1025  }
1026  }
1027  if ((int)(_udh).size() > 0) {
1028  pdutyp = pdutyp + 64;
1029  }
1030  hdr[0] = (char)(pdutyp);
1031  pdulen = (int)(sca).size()+(int)(hdr).size()+(int)(addr).size()+2+(int)(stamp).size()+(int)(udata).size();
1032  _pdu = string(pdulen, (char)0);
1033  pdulen = 0;
1034  i = 0;
1035  while (i < (int)(sca).size()) {
1036  _pdu[pdulen] = (char)(((u8)sca[i]));
1037  pdulen = pdulen + 1;
1038  i = i + 1;
1039  }
1040  i = 0;
1041  while (i < (int)(hdr).size()) {
1042  _pdu[pdulen] = (char)(((u8)hdr[i]));
1043  pdulen = pdulen + 1;
1044  i = i + 1;
1045  }
1046  i = 0;
1047  while (i < (int)(addr).size()) {
1048  _pdu[pdulen] = (char)(((u8)addr[i]));
1049  pdulen = pdulen + 1;
1050  i = i + 1;
1051  }
1052  _pdu[pdulen] = (char)(_pid);
1053  pdulen = pdulen + 1;
1054  _pdu[pdulen] = (char)(this->get_dcs());
1055  pdulen = pdulen + 1;
1056  i = 0;
1057  while (i < (int)(stamp).size()) {
1058  _pdu[pdulen] = (char)(((u8)stamp[i]));
1059  pdulen = pdulen + 1;
1060  i = i + 1;
1061  }
1062  i = 0;
1063  while (i < (int)(udata).size()) {
1064  _pdu[pdulen] = (char)(((u8)udata[i]));
1065  pdulen = pdulen + 1;
1066  i = i + 1;
1067  }
1068  _npdu = 1;
1069  return YAPI_SUCCESS;
1070 }
1071 
1073 {
1074  int udhlen = 0;
1075  int i = 0;
1076  int iei = 0;
1077  int ielen = 0;
1078  string sig;
1079  _aggSig = "";
1080  _aggIdx = 0;
1081  _aggCnt = 0;
1082  udhlen = (int)(_udh).size();
1083  i = 0;
1084  while (i+1 < udhlen) {
1085  iei = ((u8)_udh[i]);
1086  ielen = ((u8)_udh[i+1]);
1087  i = i + 2;
1088  if (i + ielen <= udhlen) {
1089  if ((iei == 0) && (ielen == 3)) {
1090  // concatenated SMS, 8-bit ref
1091  sig = YapiWrapper::ysprintf("%s-%s-%02x-%02x", _orig.c_str(), _dest.c_str(),
1092  _mref,((u8)_udh[i]));
1093  _aggSig = sig;
1094  _aggCnt = ((u8)_udh[i+1]);
1095  _aggIdx = ((u8)_udh[i+2]);
1096  }
1097  if ((iei == 8) && (ielen == 4)) {
1098  // concatenated SMS, 16-bit ref
1099  sig = YapiWrapper::ysprintf("%s-%s-%02x-%02x%02x", _orig.c_str(), _dest.c_str(),
1100  _mref, ((u8)_udh[i]),((u8)_udh[i+1]));
1101  _aggSig = sig;
1102  _aggCnt = ((u8)_udh[i+2]);
1103  _aggIdx = ((u8)_udh[i+3]);
1104  }
1105  }
1106  i = i + ielen;
1107  }
1108  return YAPI_SUCCESS;
1109 }
1110 
1111 int YSms::parsePdu(string pdu)
1112 {
1113  int rpos = 0;
1114  int addrlen = 0;
1115  int pdutyp = 0;
1116  int tslen = 0;
1117  int dcs = 0;
1118  int udlen = 0;
1119  int udhsize = 0;
1120  int udhlen = 0;
1121  int i = 0;
1122  int carry = 0;
1123  int nbits = 0;
1124  int thi_b = 0;
1125  _pdu = pdu;
1126  _npdu = 1;
1127  // parse meta-data
1128  _smsc = this->decodeAddress(pdu, 1, 2*(((u8)pdu[0])-1));
1129  rpos = 1+((u8)pdu[0]);
1130  pdutyp = ((u8)pdu[rpos]);
1131  rpos = rpos + 1;
1132  _deliv = (((pdutyp) & (3)) == 0);
1133  if (_deliv) {
1134  addrlen = ((u8)pdu[rpos]);
1135  rpos = rpos + 1;
1136  _orig = this->decodeAddress(pdu, rpos, addrlen);
1137  _dest = "";
1138  tslen = 7;
1139  } else {
1140  _mref = ((u8)pdu[rpos]);
1141  rpos = rpos + 1;
1142  addrlen = ((u8)pdu[rpos]);
1143  rpos = rpos + 1;
1144  _dest = this->decodeAddress(pdu, rpos, addrlen);
1145  _orig = "";
1146  if ((((pdutyp) & (16))) != 0) {
1147  if ((((pdutyp) & (8))) != 0) {
1148  tslen = 7;
1149  } else {
1150  tslen= 1;
1151  }
1152  } else {
1153  tslen = 0;
1154  }
1155  }
1156  rpos = rpos + ((((addrlen+3)) >> (1)));
1157  _pid = ((u8)pdu[rpos]);
1158  rpos = rpos + 1;
1159  dcs = ((u8)pdu[rpos]);
1160  rpos = rpos + 1;
1161  _alphab = (((((dcs) >> (2)))) & (3));
1162  _mclass = ((dcs) & (16+3));
1163  _stamp = this->decodeTimeStamp(pdu, rpos, tslen);
1164  rpos = rpos + tslen;
1165  // parse user data (including udh)
1166  nbits = 0;
1167  carry = 0;
1168  udlen = ((u8)pdu[rpos]);
1169  rpos = rpos + 1;
1170  if (((pdutyp) & (64)) != 0) {
1171  udhsize = ((u8)pdu[rpos]);
1172  rpos = rpos + 1;
1173  _udh = string(udhsize, (char)0);
1174  i = 0;
1175  while (i < udhsize) {
1176  _udh[i] = (char)(((u8)pdu[rpos]));
1177  rpos = rpos + 1;
1178  i = i + 1;
1179  }
1180  if (_alphab == 0) {
1181  // 7-bit encoding
1182  udhlen = (((8 + 8*udhsize + 6)) / (7));
1183  nbits = 7*udhlen - 8 - 8*udhsize;
1184  if (nbits > 0) {
1185  thi_b = ((u8)pdu[rpos]);
1186  rpos = rpos + 1;
1187  carry = ((thi_b) >> (nbits));
1188  nbits = 8 - nbits;
1189  }
1190  } else {
1191  // byte encoding
1192  udhlen = 1+udhsize;
1193  }
1194  udlen = udlen - udhlen;
1195  } else {
1196  udhsize = 0;
1197  _udh = string(0, (char)0);
1198  }
1199  _udata = string(udlen, (char)0);
1200  if (_alphab == 0) {
1201  // 7-bit encoding
1202  i = 0;
1203  while (i < udlen) {
1204  if (nbits == 7) {
1205  _udata[i] = (char)(carry);
1206  carry = 0;
1207  nbits = 0;
1208  } else {
1209  thi_b = ((u8)pdu[rpos]);
1210  rpos = rpos + 1;
1211  _udata[i] = (char)(((carry) | ((((((thi_b) << (nbits)))) & (127)))));
1212  carry = ((thi_b) >> ((7 - nbits)));
1213  nbits = nbits + 1;
1214  }
1215  i = i + 1;
1216  }
1217  } else {
1218  // 8-bit encoding
1219  i = 0;
1220  while (i < udlen) {
1221  _udata[i] = (char)(((u8)pdu[rpos]));
1222  rpos = rpos + 1;
1223  i = i + 1;
1224  }
1225  }
1226  this->parseUserDataHeader();
1227  return YAPI_SUCCESS;
1228 }
1229 
1230 int YSms::send(void)
1231 {
1232  int i = 0;
1233  int retcode = 0;
1234  YSms pdu;
1235 
1236  if (_npdu == 0) {
1237  this->generatePdu();
1238  }
1239  if (_npdu == 1) {
1240  return _mbox->_upload("sendSMS", _pdu);
1241  }
1242  retcode = YAPI_SUCCESS;
1243  i = 0;
1244  while ((i < _npdu) && (retcode == YAPI_SUCCESS)) {
1245  pdu = _parts[i];
1246  retcode= pdu.send();
1247  i = i + 1;
1248  }
1249  return retcode;
1250 }
1251 
1253 {
1254  int i = 0;
1255  int retcode = 0;
1256  YSms pdu;
1257 
1258  if (_slot > 0) {
1259  return _mbox->clearSIMSlot(_slot);
1260  }
1261  retcode = YAPI_SUCCESS;
1262  i = 0;
1263  while ((i < _npdu) && (retcode == YAPI_SUCCESS)) {
1264  pdu = _parts[i];
1265  retcode= pdu.deleteFromSIM();
1266  i = i + 1;
1267  }
1268  return retcode;
1269 }
1270 //--- (end of generated code: YSms implementation)
1271 
1272 
1273 YMessageBox::YMessageBox(const string& func): YFunction(func)
1274 //--- (generated code: YMessageBox initialization)
1275  ,_slotsInUse(SLOTSINUSE_INVALID)
1276  ,_slotsCount(SLOTSCOUNT_INVALID)
1277  ,_slotsBitmap(SLOTSBITMAP_INVALID)
1278  ,_pduSent(PDUSENT_INVALID)
1279  ,_pduReceived(PDURECEIVED_INVALID)
1280  ,_command(COMMAND_INVALID)
1281  ,_valueCallbackMessageBox(NULL)
1282  ,_nextMsgRef(0)
1283  ,_gsm2unicodeReady(0)
1284 //--- (end of generated code: YMessageBox initialization)
1285 {
1286  _className="MessageBox";
1287 }
1288 
1290 {
1291 //--- (generated code: YMessageBox cleanup)
1292 //--- (end of generated code: YMessageBox cleanup)
1293 }
1294 //--- (generated code: YMessageBox implementation)
1295 // static attributes
1298 
1300 {
1301  if(json_val->has("slotsInUse")) {
1302  _slotsInUse = json_val->getInt("slotsInUse");
1303  }
1304  if(json_val->has("slotsCount")) {
1305  _slotsCount = json_val->getInt("slotsCount");
1306  }
1307  if(json_val->has("slotsBitmap")) {
1308  _slotsBitmap = json_val->getString("slotsBitmap");
1309  }
1310  if(json_val->has("pduSent")) {
1311  _pduSent = json_val->getInt("pduSent");
1312  }
1313  if(json_val->has("pduReceived")) {
1314  _pduReceived = json_val->getInt("pduReceived");
1315  }
1316  if(json_val->has("command")) {
1317  _command = json_val->getString("command");
1318  }
1319  return YFunction::_parseAttr(json_val);
1320 }
1321 
1322 
1331 {
1332  int res = 0;
1334  try {
1337  {
1340  }
1341  }
1342  }
1343  res = _slotsInUse;
1344  } catch (std::exception) {
1346  throw;
1347  }
1349  return res;
1350 }
1351 
1360 {
1361  int res = 0;
1363  try {
1366  {
1369  }
1370  }
1371  }
1372  res = _slotsCount;
1373  } catch (std::exception) {
1375  throw;
1376  }
1378  return res;
1379 }
1380 
1382 {
1383  string res;
1385  try {
1388  {
1391  }
1392  }
1393  }
1394  res = _slotsBitmap;
1395  } catch (std::exception) {
1397  throw;
1398  }
1400  return res;
1401 }
1402 
1411 {
1412  int res = 0;
1414  try {
1417  {
1420  }
1421  }
1422  }
1423  res = _pduSent;
1424  } catch (std::exception) {
1426  throw;
1427  }
1429  return res;
1430 }
1431 
1442 {
1443  string rest_val;
1444  int res;
1446  try {
1447  char buf[32]; sprintf(buf, "%d", newval); rest_val = string(buf);
1448  res = _setAttr("pduSent", rest_val);
1449  } catch (std::exception) {
1451  throw;
1452  }
1454  return res;
1455 }
1456 
1465 {
1466  int res = 0;
1468  try {
1471  {
1474  }
1475  }
1476  }
1477  res = _pduReceived;
1478  } catch (std::exception) {
1480  throw;
1481  }
1483  return res;
1484 }
1485 
1496 {
1497  string rest_val;
1498  int res;
1500  try {
1501  char buf[32]; sprintf(buf, "%d", newval); rest_val = string(buf);
1502  res = _setAttr("pduReceived", rest_val);
1503  } catch (std::exception) {
1505  throw;
1506  }
1508  return res;
1509 }
1510 
1512 {
1513  string res;
1515  try {
1518  {
1521  }
1522  }
1523  }
1524  res = _command;
1525  } catch (std::exception) {
1527  throw;
1528  }
1530  return res;
1531 }
1532 
1533 int YMessageBox::set_command(const string& newval)
1534 {
1535  string rest_val;
1536  int res;
1538  try {
1539  rest_val = newval;
1540  res = _setAttr("command", rest_val);
1541  } catch (std::exception) {
1543  throw;
1544  }
1546  return res;
1547 }
1548 
1577 {
1578  YMessageBox* obj = NULL;
1579  int taken = 0;
1580  if (YAPI::_apiInitialized) {
1582  taken = 1;
1583  }try {
1584  obj = (YMessageBox*) YFunction::_FindFromCache("MessageBox", func);
1585  if (obj == NULL) {
1586  obj = new YMessageBox(func);
1587  YFunction::_AddToCache("MessageBox", func, obj);
1588  }
1589  } catch (std::exception) {
1591  throw;
1592  }
1594  return obj;
1595 }
1596 
1609 {
1610  string val;
1611  if (callback != NULL) {
1613  } else {
1615  }
1616  _valueCallbackMessageBox = callback;
1617  // Immediately invoke value callback with current value
1618  if (callback != NULL && this->isOnline()) {
1619  val = _advertisedValue;
1620  if (!(val == "")) {
1621  this->_invokeValueCallback(val);
1622  }
1623  }
1624  return 0;
1625 }
1626 
1628 {
1629  if (_valueCallbackMessageBox != NULL) {
1630  _valueCallbackMessageBox(this, value);
1631  } else {
1633  }
1634  return 0;
1635 }
1636 
1638 {
1639  _nextMsgRef = _nextMsgRef + 1;
1640  return _nextMsgRef;
1641 }
1642 
1644 {
1645  _prevBitmapStr = "";
1646  return this->set_command(YapiWrapper::ysprintf("DS%d",slot));
1647 }
1648 
1650 {
1651  string binPdu;
1652  vector<string> arrPdu;
1653  string hexPdu;
1654  YSms sms;
1655 
1656  binPdu = this->_download(YapiWrapper::ysprintf("sms.json?pos=%d&len=1",slot));
1657  arrPdu = this->_json_get_array(binPdu);
1658  hexPdu = this->_decode_json_string(arrPdu[0]);
1659  sms = YSms(this);
1660  sms.set_slot(slot);
1661  sms.parsePdu(YAPI::_hexStr2Bin(hexPdu));
1662  return sms;
1663 }
1664 
1666 {
1667  int i = 0;
1668  int uni = 0;
1669  _gsm2unicode.clear();
1670  // 00-07
1671  _gsm2unicode.push_back(64);
1672  _gsm2unicode.push_back(163);
1673  _gsm2unicode.push_back(36);
1674  _gsm2unicode.push_back(165);
1675  _gsm2unicode.push_back(232);
1676  _gsm2unicode.push_back(233);
1677  _gsm2unicode.push_back(249);
1678  _gsm2unicode.push_back(236);
1679  // 08-0F
1680  _gsm2unicode.push_back(242);
1681  _gsm2unicode.push_back(199);
1682  _gsm2unicode.push_back(10);
1683  _gsm2unicode.push_back(216);
1684  _gsm2unicode.push_back(248);
1685  _gsm2unicode.push_back(13);
1686  _gsm2unicode.push_back(197);
1687  _gsm2unicode.push_back(229);
1688  // 10-17
1689  _gsm2unicode.push_back(916);
1690  _gsm2unicode.push_back(95);
1691  _gsm2unicode.push_back(934);
1692  _gsm2unicode.push_back(915);
1693  _gsm2unicode.push_back(923);
1694  _gsm2unicode.push_back(937);
1695  _gsm2unicode.push_back(928);
1696  _gsm2unicode.push_back(936);
1697  // 18-1F
1698  _gsm2unicode.push_back(931);
1699  _gsm2unicode.push_back(920);
1700  _gsm2unicode.push_back(926);
1701  _gsm2unicode.push_back(27);
1702  _gsm2unicode.push_back(198);
1703  _gsm2unicode.push_back(230);
1704  _gsm2unicode.push_back(223);
1705  _gsm2unicode.push_back(201);
1706  // 20-7A
1707  i = 32;
1708  while (i <= 122) {
1709  _gsm2unicode.push_back(i);
1710  i = i + 1;
1711  }
1712  // exceptions in range 20-7A
1713  _gsm2unicode[36] = 164;
1714  _gsm2unicode[64] = 161;
1715  _gsm2unicode[91] = 196;
1716  _gsm2unicode[92] = 214;
1717  _gsm2unicode[93] = 209;
1718  _gsm2unicode[94] = 220;
1719  _gsm2unicode[95] = 167;
1720  _gsm2unicode[96] = 191;
1721  // 7B-7F
1722  _gsm2unicode.push_back(228);
1723  _gsm2unicode.push_back(246);
1724  _gsm2unicode.push_back(241);
1725  _gsm2unicode.push_back(252);
1726  _gsm2unicode.push_back(224);
1727  // Invert table as well wherever possible
1728  _iso2gsm = string(256, (char)0);
1729  i = 0;
1730  while (i <= 127) {
1731  uni = _gsm2unicode[i];
1732  if (uni <= 255) {
1733  _iso2gsm[uni] = (char)(i);
1734  }
1735  i = i + 1;
1736  }
1737  i = 0;
1738  while (i < 4) {
1739  // mark escape sequences
1740  _iso2gsm[91+i] = (char)(27);
1741  _iso2gsm[123+i] = (char)(27);
1742  i = i + 1;
1743  }
1744  // Done
1745  _gsm2unicodeReady = true;
1746  return YAPI_SUCCESS;
1747 }
1748 
1749 vector<int> YMessageBox::gsm2unicode(string gsm)
1750 {
1751  int i = 0;
1752  int gsmlen = 0;
1753  int reslen = 0;
1754  vector<int> res;
1755  int uni = 0;
1756  if (!(_gsm2unicodeReady)) {
1757  this->initGsm2Unicode();
1758  }
1759  gsmlen = (int)(gsm).size();
1760  reslen = gsmlen;
1761  i = 0;
1762  while (i < gsmlen) {
1763  if (((u8)gsm[i]) == 27) {
1764  reslen = reslen - 1;
1765  }
1766  i = i + 1;
1767  }
1768  res.clear();
1769  i = 0;
1770  while (i < gsmlen) {
1771  uni = _gsm2unicode[((u8)gsm[i])];
1772  if ((uni == 27) && (i+1 < gsmlen)) {
1773  i = i + 1;
1774  uni = ((u8)gsm[i]);
1775  if (uni < 60) {
1776  if (uni < 41) {
1777  if (uni==20) {
1778  uni=94;
1779  } else {
1780  if (uni==40) {
1781  uni=123;
1782  } else {
1783  uni=0;
1784  }
1785  }
1786  } else {
1787  if (uni==41) {
1788  uni=125;
1789  } else {
1790  if (uni==47) {
1791  uni=92;
1792  } else {
1793  uni=0;
1794  }
1795  }
1796  }
1797  } else {
1798  if (uni < 62) {
1799  if (uni==60) {
1800  uni=91;
1801  } else {
1802  if (uni==61) {
1803  uni=126;
1804  } else {
1805  uni=0;
1806  }
1807  }
1808  } else {
1809  if (uni==62) {
1810  uni=93;
1811  } else {
1812  if (uni==64) {
1813  uni=124;
1814  } else {
1815  if (uni==101) {
1816  uni=164;
1817  } else {
1818  uni=0;
1819  }
1820  }
1821  }
1822  }
1823  }
1824  }
1825  if (uni > 0) {
1826  res.push_back(uni);
1827  }
1828  i = i + 1;
1829  }
1830  return res;
1831 }
1832 
1833 string YMessageBox::gsm2str(string gsm)
1834 {
1835  int i = 0;
1836  int gsmlen = 0;
1837  int reslen = 0;
1838  string resbin;
1839  string resstr;
1840  int uni = 0;
1841  if (!(_gsm2unicodeReady)) {
1842  this->initGsm2Unicode();
1843  }
1844  gsmlen = (int)(gsm).size();
1845  reslen = gsmlen;
1846  i = 0;
1847  while (i < gsmlen) {
1848  if (((u8)gsm[i]) == 27) {
1849  reslen = reslen - 1;
1850  }
1851  i = i + 1;
1852  }
1853  resbin = string(reslen, (char)0);
1854  i = 0;
1855  reslen = 0;
1856  while (i < gsmlen) {
1857  uni = _gsm2unicode[((u8)gsm[i])];
1858  if ((uni == 27) && (i+1 < gsmlen)) {
1859  i = i + 1;
1860  uni = ((u8)gsm[i]);
1861  if (uni < 60) {
1862  if (uni < 41) {
1863  if (uni==20) {
1864  uni=94;
1865  } else {
1866  if (uni==40) {
1867  uni=123;
1868  } else {
1869  uni=0;
1870  }
1871  }
1872  } else {
1873  if (uni==41) {
1874  uni=125;
1875  } else {
1876  if (uni==47) {
1877  uni=92;
1878  } else {
1879  uni=0;
1880  }
1881  }
1882  }
1883  } else {
1884  if (uni < 62) {
1885  if (uni==60) {
1886  uni=91;
1887  } else {
1888  if (uni==61) {
1889  uni=126;
1890  } else {
1891  uni=0;
1892  }
1893  }
1894  } else {
1895  if (uni==62) {
1896  uni=93;
1897  } else {
1898  if (uni==64) {
1899  uni=124;
1900  } else {
1901  if (uni==101) {
1902  uni=164;
1903  } else {
1904  uni=0;
1905  }
1906  }
1907  }
1908  }
1909  }
1910  }
1911  if ((uni > 0) && (uni < 256)) {
1912  resbin[reslen] = (char)(uni);
1913  reslen = reslen + 1;
1914  }
1915  i = i + 1;
1916  }
1917  resstr = resbin;
1918  if ((int)(resstr).length() > reslen) {
1919  resstr = (resstr).substr(0, reslen);
1920  }
1921  return resstr;
1922 }
1923 
1924 string YMessageBox::str2gsm(string msg)
1925 {
1926  string asc;
1927  int asclen = 0;
1928  int i = 0;
1929  int ch = 0;
1930  int gsm7 = 0;
1931  int extra = 0;
1932  string res;
1933  int wpos = 0;
1934  if (!(_gsm2unicodeReady)) {
1935  this->initGsm2Unicode();
1936  }
1937  asc = msg;
1938  asclen = (int)(asc).size();
1939  extra = 0;
1940  i = 0;
1941  while (i < asclen) {
1942  ch = ((u8)asc[i]);
1943  gsm7 = ((u8)_iso2gsm[ch]);
1944  if (gsm7 == 27) {
1945  extra = extra + 1;
1946  }
1947  if (gsm7 == 0) {
1948  // cannot use standard GSM encoding
1949  res = string(0, (char)0);
1950  return res;
1951  }
1952  i = i + 1;
1953  }
1954  res = string(asclen+extra, (char)0);
1955  wpos = 0;
1956  i = 0;
1957  while (i < asclen) {
1958  ch = ((u8)asc[i]);
1959  gsm7 = ((u8)_iso2gsm[ch]);
1960  res[wpos] = (char)(gsm7);
1961  wpos = wpos + 1;
1962  if (gsm7 == 27) {
1963  if (ch < 100) {
1964  if (ch<93) {
1965  if (ch<92) {
1966  gsm7=60;
1967  } else {
1968  gsm7=47;
1969  }
1970  } else {
1971  if (ch<94) {
1972  gsm7=62;
1973  } else {
1974  gsm7=20;
1975  }
1976  }
1977  } else {
1978  if (ch<125) {
1979  if (ch<124) {
1980  gsm7=40;
1981  } else {
1982  gsm7=64;
1983  }
1984  } else {
1985  if (ch<126) {
1986  gsm7=41;
1987  } else {
1988  gsm7=61;
1989  }
1990  }
1991  }
1992  res[wpos] = (char)(gsm7);
1993  wpos = wpos + 1;
1994  }
1995  i = i + 1;
1996  }
1997  return res;
1998 }
1999 
2001 {
2002  string bitmapStr;
2003  string prevBitmap;
2004  string newBitmap;
2005  int slot = 0;
2006  int nslots = 0;
2007  int pduIdx = 0;
2008  int idx = 0;
2009  int bitVal = 0;
2010  int prevBit = 0;
2011  int i = 0;
2012  int nsig = 0;
2013  int cnt = 0;
2014  string sig;
2015  vector<YSms> newArr;
2016  vector<YSms> newMsg;
2017  vector<YSms> newAgg;
2018  vector<string> signatures;
2019  YSms sms;
2020 
2021  bitmapStr = this->get_slotsBitmap();
2022  if (bitmapStr == _prevBitmapStr) {
2023  return YAPI_SUCCESS;
2024  }
2025  prevBitmap = YAPI::_hexStr2Bin(_prevBitmapStr);
2026  newBitmap = YAPI::_hexStr2Bin(bitmapStr);
2027  _prevBitmapStr = bitmapStr;
2028  nslots = 8*(int)(newBitmap).size();
2029  newArr.clear();
2030  newMsg.clear();
2031  signatures.clear();
2032  nsig = 0;
2033  // copy known messages
2034  pduIdx = 0;
2035  while (pduIdx < (int)_pdus.size()) {
2036  sms = _pdus[pduIdx];
2037  slot = sms.get_slot();
2038  idx = ((slot) >> (3));
2039  if (idx < (int)(newBitmap).size()) {
2040  bitVal = ((1) << ((((slot) & (7)))));
2041  if ((((((u8)newBitmap[idx])) & (bitVal))) != 0) {
2042  newArr.push_back(sms);
2043  if (sms.get_concatCount() == 0) {
2044  newMsg.push_back(sms);
2045  } else {
2046  sig = sms.get_concatSignature();
2047  i = 0;
2048  while ((i < nsig) && ((int)(sig).length() > 0)) {
2049  if (signatures[i] == sig) {
2050  sig = "";
2051  }
2052  i = i + 1;
2053  }
2054  if ((int)(sig).length() > 0) {
2055  signatures.push_back(sig);
2056  nsig = nsig + 1;
2057  }
2058  }
2059  }
2060  }
2061  pduIdx = pduIdx + 1;
2062  }
2063  // receive new messages
2064  slot = 0;
2065  while (slot < nslots) {
2066  idx = ((slot) >> (3));
2067  bitVal = ((1) << ((((slot) & (7)))));
2068  prevBit = 0;
2069  if (idx < (int)(prevBitmap).size()) {
2070  prevBit = ((((u8)prevBitmap[idx])) & (bitVal));
2071  }
2072  if ((((((u8)newBitmap[idx])) & (bitVal))) != 0) {
2073  if (prevBit == 0) {
2074  sms = this->fetchPdu(slot);
2075  newArr.push_back(sms);
2076  if (sms.get_concatCount() == 0) {
2077  newMsg.push_back(sms);
2078  } else {
2079  sig = sms.get_concatSignature();
2080  i = 0;
2081  while ((i < nsig) && ((int)(sig).length() > 0)) {
2082  if (signatures[i] == sig) {
2083  sig = "";
2084  }
2085  i = i + 1;
2086  }
2087  if ((int)(sig).length() > 0) {
2088  signatures.push_back(sig);
2089  nsig = nsig + 1;
2090  }
2091  }
2092  }
2093  }
2094  slot = slot + 1;
2095  }
2096  _pdus = newArr;
2097  // append complete concatenated messages
2098  i = 0;
2099  while (i < nsig) {
2100  sig = signatures[i];
2101  cnt = 0;
2102  pduIdx = 0;
2103  while (pduIdx < (int)_pdus.size()) {
2104  sms = _pdus[pduIdx];
2105  if (sms.get_concatCount() > 0) {
2106  if (sms.get_concatSignature() == sig) {
2107  if (cnt == 0) {
2108  cnt = sms.get_concatCount();
2109  newAgg.clear();
2110  }
2111  newAgg.push_back(sms);
2112  }
2113  }
2114  pduIdx = pduIdx + 1;
2115  }
2116  if ((cnt > 0) && ((int)newAgg.size() == cnt)) {
2117  sms = YSms(this);
2118  sms.set_parts(newAgg);
2119  newMsg.push_back(sms);
2120  }
2121  i = i + 1;
2122  }
2123  _messages = newMsg;
2124  return YAPI_SUCCESS;
2125 }
2126 
2127 vector<YSms> YMessageBox::get_pdus(void)
2128 {
2129  this->checkNewMessages();
2130  return _pdus;
2131 }
2132 
2141 {
2142  int retcode = 0;
2143 
2144  retcode = this->set_pduReceived(0);
2145  if (retcode != YAPI_SUCCESS) {
2146  return retcode;
2147  }
2148  retcode = this->set_pduSent(0);
2149  return retcode;
2150 }
2151 
2167 int YMessageBox::sendTextMessage(string recipient,string message)
2168 {
2169  YSms sms;
2170 
2171  sms = YSms(this);
2172  sms.set_recipient(recipient);
2173  sms.addText(message);
2174  return sms.send();
2175 }
2176 
2193 int YMessageBox::sendFlashMessage(string recipient,string message)
2194 {
2195  YSms sms;
2196 
2197  sms = YSms(this);
2198  sms.set_recipient(recipient);
2199  sms.set_msgClass(0);
2200  sms.addText(message);
2201  return sms.send();
2202 }
2203 
2215 {
2216  YSms sms;
2217  sms = YSms(this);
2218  sms.set_recipient(recipient);
2219  return sms;
2220 }
2221 
2230 vector<YSms> YMessageBox::get_messages(void)
2231 {
2232  this->checkNewMessages();
2233  return _messages;
2234 }
2235 
2237 {
2238  string hwid;
2239 
2240  if(YISERR(_nextFunction(hwid)) || hwid=="") {
2241  return NULL;
2242  }
2243  return YMessageBox::FindMessageBox(hwid);
2244 }
2245 
2247 {
2248  vector<YFUN_DESCR> v_fundescr;
2249  YDEV_DESCR ydevice;
2250  string serial, funcId, funcName, funcVal, errmsg;
2251 
2252  if(YISERR(YapiWrapper::getFunctionsByClass("MessageBox", 0, v_fundescr, sizeof(YFUN_DESCR), errmsg)) ||
2253  v_fundescr.size() == 0 ||
2254  YISERR(YapiWrapper::getFunctionInfo(v_fundescr[0], ydevice, serial, funcId, funcName, funcVal, errmsg))) {
2255  return NULL;
2256  }
2257  return YMessageBox::FindMessageBox(serial+"."+funcId);
2258 }
2259 
2260 //--- (end of generated code: YMessageBox implementation)
2261 
2262 //--- (generated code: YMessageBox functions)
2263 //--- (end of generated code: YMessageBox functions)
vector< YSms > _parts
virtual int get_dcs(void)
string _advertisedValue
Definition: yocto_api.h:1569
yCRITICAL_SECTION _this_cs
Definition: yocto_api.h:1563
string get_command(void)
vector< YSms > _messages
virtual int set_alphabet(int val)
YMessageBoxValueCallback _valueCallbackMessageBox
virtual int get_msgRef(void)
YRETCODE _load_unsafe(int msValidity)
Definition: yocto_api.cpp:3327
static const string SLOTSBITMAP_INVALID
virtual vector< int > gsm2unicode(string gsm)
virtual int set_userDataHeader(string val)
static YMessageBox * FirstMessageBox(void)
string _udata
string _dest
string _prevBitmapStr
virtual int set_msgClass(int val)
virtual string decodeTimeStamp(string exp, int ofs, int siz)
virtual YSms fetchPdu(int slot)
void(* YMessageBoxValueCallback)(YMessageBox *func, const string &functionValue)
string _smsc
string _orig
int set_pduSent(int newval)
virtual int get_protocolId(void)
YRETCODE _upload(const string &path, const string &content)
Definition: yocto_api.cpp:3098
static int DefaultCacheValidity
Definition: yocto_api.h:468
int _alphab
string getString(const string &key)
Definition: yocto_api.cpp:773
bool _deliv
virtual int get_concatIndex(void)
virtual string encodeAddress(string addr)
YSms(void)
u64 _cacheExpiration
Definition: yocto_api.h:1571
virtual string get_userDataHeader(void)
virtual string get_sender(void)
string get_slotsBitmap(void)
virtual int nextMsgRef(void)
void yLeaveCriticalSection(yCRITICAL_SECTION *cs)
Definition: ythread.c:672
virtual int set_timestamp(string val)
virtual int sendTextMessage(string recipient, string message)
string _pdu
virtual string get_userData(void)
string _download(const string &url)
Definition: yocto_api.cpp:3053
virtual vector< YSms > get_parts(void)
static YRETCODE getFunctionInfo(YFUN_DESCR fundesc, YDEV_DESCR &devdescr, string &serial, string &funcId, string &funcName, string &funcVal, string &errmsg)
Definition: yocto_api.cpp:4930
string _stamp
virtual int set_slot(int val)
vector< int > _gsm2unicode
int get_slotsCount(void)
virtual int set_sender(string val)
int get_slotsInUse(void)
string _aggSig
#define YAPI_INVALID_STRING
Definition: yocto_api.h:69
virtual int set_smsc(string val)
YMessageBox * nextMessageBox(void)
virtual int _parseAttr(YJSONObject *json_val)
Definition: yocto_api.cpp:2367
virtual int udataSize(void)
virtual int generateParts(void)
virtual int _invokeValueCallback(string value)
virtual int get_alphabet(void)
virtual string gsm2str(string gsm)
static YMessageBox * FindMessageBox(string func)
virtual int set_received(bool val)
YAPI_FUNCTION YFUN_DESCR
Definition: yocto_api.h:230
virtual int set_pdu(string pdu)
int getInt(const string &key)
Definition: yocto_api.cpp:779
static u64 GetTickCount(void)
Definition: yocto_api.cpp:4755
static void _AddToCache(const string &classname, const string &func, YFunction *obj)
Definition: yocto_api.cpp:2345
virtual bool isReceived(void)
virtual vector< YSms > get_pdus(void)
virtual int get_slot(void)
virtual int convertToUnicode(void)
virtual int checkNewMessages(void)
virtual int addUnicodeData(vector< int > val)
YAPI_DEVICE YDEV_DESCR
Definition: yocto_api.h:229
static YFunction * _FindFromCache(const string &classname, const string &func)
Definition: yocto_api.cpp:2338
virtual int parsePdu(string pdu)
vector< string > _json_get_array(const string &json)
Definition: yocto_api.cpp:2811
static const int PDUSENT_INVALID
virtual int initGsm2Unicode(void)
static string ysprintf(const char *fmt,...)
Definition: yocto_api.cpp:4997
virtual int clearSIMSlot(int slot)
virtual int parseUserDataHeader(void)
void yEnterCriticalSection(yCRITICAL_SECTION *cs)
Definition: ythread.c:647
static yCRITICAL_SECTION _global_cs
Definition: yocto_api.h:476
static const string COMMAND_INVALID
virtual string get_timestamp(void)
string _decode_json_string(const string &json)
Definition: yocto_api.cpp:2871
bool isOnline(void)
Definition: yocto_api.cpp:3291
virtual string encodeUserData(void)
virtual int get_concatCount(void)
static string _hexStr2Bin(const string &str)
Definition: yocto_api.cpp:4130
virtual int generatePdu(void)
static const int SLOTSINUSE_INVALID
virtual int set_userData(string val)
static int getFunctionsByClass(const string &class_str, YFUN_DESCR prevfundesc, vector< YFUN_DESCR > &buffer, int maxsize, string &errmsg)
Definition: yocto_api.cpp:4852
virtual vector< YSms > get_messages(void)
int get_pduSent(void)
virtual int send(void)
string _className
Definition: yocto_api.h:1558
virtual vector< int > get_unicodeData(void)
virtual string get_recipient(void)
virtual string encodeTimeStamp(string exp)
virtual string get_textData(void)
int _mclass
virtual int _parseAttr(YJSONObject *json_val)
int _aggCnt
int set_command(const string &newval)
string _udh
virtual YSms newMessage(string recipient)
int _aggIdx
virtual int set_protocolId(int val)
int set_pduReceived(int newval)
virtual string str2gsm(string msg)
virtual int clearPduCounters(void)
int get_pduReceived(void)
virtual string get_smsc(void)
static const int PDURECEIVED_INVALID
YMessageBox(const string &func)
virtual int addText(string val)
virtual int set_parts(vector< YSms > parts)
static bool _apiInitialized
Definition: yocto_api.h:475
YRETCODE _nextFunction(string &hwId)
Definition: yocto_api.cpp:2709
virtual string get_pdu(void)
static void _UpdateValueCallbackList(YFunction *func, bool add)
Definition: yocto_api.cpp:3509
virtual int deleteFromSIM(void)
#define YISERR(retcode)
Definition: ydef.h:394
virtual int get_partCount(void)
bool has(const string &key)
Definition: yocto_api.cpp:735
virtual int set_msgRef(int val)
YRETCODE _setAttr(string attrname, string newvalue)
Definition: yocto_api.cpp:2968
vector< YSms > _pdus
virtual string get_concatSignature(void)
virtual int sendFlashMessage(string recipient, string message)
YMessageBox * _mbox
virtual string decodeAddress(string addr, int ofs, int siz)
virtual int get_msgClass(void)
virtual int set_recipient(string val)
virtual int _invokeValueCallback(string value)
Definition: yocto_api.cpp:2563
static const int SLOTSCOUNT_INVALID
virtual int set_dcs(int val)
virtual int registerValueCallback(YMessageBoxValueCallback callback)


yoctopuce_altimeter
Author(s): Anja Sheppard
autogenerated on Mon Jun 10 2019 15:49:11