#include "gsm.h"
#include "misc.h"
#include "log.h"
using namespace misc;
using namespace log;
using namespace modem;
using namespace gsm;
int gsm::smsGetMemTypes (Handle ph, SmsAction act)
{
CString s = sendAt(ph, "+CPMS=?");
/*
夏整痞 褕閑錶:
+CPMS: (("SM",...,"SR"),("SM",...,"SR"),...)
\-- 餾粵徹 -/ \-- 頑震艘 -/
*/
int i = s.find("(") + 1; // !$$$ �, 媽� 詭 順 擇慌蜴駕...
if (s[i] == '(') ++i; // 隅義璃� 縈螂蝌 憐詭� � 獗 裂靦
int j = s.find(")", i);
if (act == saWriteSend)
{
i = s.find("(", j) + 1;
j = s.find(")", i);
}
s = s.sub(i, j - i);
int r = 0;
if (s.find("SM") != -1) r |= mtSM;
if (s.find("ME") != -1) r |= mtME;
if (s.find("MT") != -1) r |= mtMT;
if (s.find("SR") != -1) r |= mtSR;
return r;
}
int gsm::smsGetMem (Handle ph, SmsAction act, int *free, int *total)
{
CString s = sendAt(ph, "+CPMS?");
/*
夏整痞 褕閑錶:
+CPMS: "XX",x,x,"XX",x,x,...
\-read-/ \-write/
*/
int i, j, k, m;
i = s.find("\"");
j = s.find(",", i + 1);
k = s.find(",", j + 1);
m = s.find(",", k + 1);
if (act == saWriteSend)
{
i = s.find("\"", m + 1);
j = s.find(",", i + 1);
k = s.find(",", j + 1);
m = s.find(",", k + 1);
if (m == -1) m = s.find(LF, k + 1);
}
int tl = str2int(s.sub(k + 1, m - k - 1));
if (free) *free = tl - str2int(s.sub(j + 1, k - j - 1));
if (total) *total = tl;
s = s.sub(i + 1, j - i - 2);
if (s == "SM") return mtSM;
else if (s == "ME") return mtME;
else if (s == "MT") return mtMT;
else if (s == "SR") return mtSR;
else return 0;
}
int gsm::smsSetMem (Handle ph, SmsAction act, MemType mem, int *total)
{
CString s = "+CPMS=";
int i, j, k;
if (act == saWriteSend)
{
CString s1 = sendAt(ph, "+CPMS?");
i = s1.find("\"") + 1;
j = s1.find("\"", i);
s.append('"' + s1.sub(i, j - i) + "\",");
}
s.append('"');
if (mem == mtSM) s.append("SM");
else if (mem == mtME) s.append("ME");
else if (mem == mtMT) s.append("MT");
else if (mem == mtSR) s.append("SR");
s.append('"');
s = sendAt(ph, s);
/*
夏整痞 褕閑錶:
+CPMS: x,x,x,x,...
\r/ \w/
*/
i = s.find(":");
j = s.find(",", i + 1);
k = s.find(",", j + 1);
if (k == -1) k = s.find(LF, j + 1);
if (act == saWriteSend)
{
i = k;
j = s.find(",", i + 1);
k = s.find(",", j + 1);
if (k = -1) k = s.find(LF, j + 1);
}
int ud = str2int(s.sub(i + 1, j - i - 1));
int tl = str2int(s.sub(j + 1, k - j - 1));
if (total) *total = tl;
return tl - ud;
}
int gsm::smsGetFormat (Handle ph)
{
CString s = sendAt(ph, "+CMGF?");
/*
夏整痞 褕閑錶:
+CMGF: <縴整痞 SMS>
*/
int i = s.find(":") + 1;
int j = s.find(LF, i);
i = str2int(s.sub(i, j - i));
if (i) return sfText;
else return sfPdu;
}
void gsm::smsSetFormat (Handle ph, SmsFormat mode)
{
CString s = "+CMGF=";
if (mode == sfPdu) s.append("0");
else s.append("1");
sendAt(ph, s);
}
bool gsm::smsGetPdu (Handle ph, int i, Message &msg)
{
writeModem(ph, "+CMGR=" + int2str(i));
CString s = readModem(ph);
ModemResult res = lastResult(ph);
if (res == mrError || res == mrCmsError) return false;
else if (res != mrOk)
{
sendModemError(portName(ph), lastWrite(ph), s, res == mrTimeout);
throw Error();
}
msg.index = i;
/*
夏整痞 褕閑錶:
+CMGR: <stat>,[?],<length>
*/
i = s.find(":") + 1;
int j = s.find(",", i);
i = str2int(s.sub(i, j - i));
switch (i)
{
case 0: msg.stat = ssUnread; break;
case 1: msg.stat = ssRead; break;
case 2: msg.stat = ssUnsent; break;
case 3: msg.stat = ssSent; break;
case 4: msg.stat = ssAll; break;
}
i = s.find(LF, j + 1) + 1;
j = s.find(LF, i);
msg.pdu = s.sub(i, j - i);
return true;
}
Messages gsm::smsGetPdus (Handle ph, SmsStatus stat)
{
CString s = "+CMGL=";
switch (stat)
{
case ssUnread: s.append("0"); break;
case ssRead: s.append("1"); break;
case ssUnsent: s.append("2"); break;
case ssSent: s.append("3"); break;
case ssAll: s.append("4"); break;
}
s = sendAt(ph, s);
/*
夏整痞 褕閑錶:
+CMGL: <index>,<stat>,[?],<length>
*/
Lines ls;
splitResponse(s, ls);
int j, k;
Message m;
Messages msgs;
for (int i = 0; i < ls.size() / 2; ++i)
{
s = ls[i * 2];
j = s.find(":") + 1;
k = s.find(",", j);
m.index = str2int(s.sub(j, k - j)); // 慚滇蜴
j = s.find(",", k + 1);
k = str2int(s.sub(k + 1, j - k - 1)); // 羲痞檀
switch (k)
{
case 0: m.stat = ssUnread; break;
case 1: m.stat = ssRead; break;
case 2: m.stat = ssUnsent; break;
case 3: m.stat = ssSent; break;
case 4: m.stat = ssAll; break;
}
m.pdu = ls[i * 2 + 1];
msgs.push_back(m);
}
return msgs;
}
int gsm::smsWritePdu (Handle ph, const CString &pdu)
{
unsigned char hi = pdu[0], lo = pdu[1];
hi -= (hi >= '0' && hi <= '9') ? '0' : ((hi >= 'A' && hi <= 'F') ? 'A' - 10 : 'a' - 10);
lo -= (lo >= '0' && lo <= '9') ? '0' : ((lo >= 'A' && lo <= 'F') ? 'A' - 10 : 'a' - 10);
int sz = hi << 4 | lo;
sendAt(ph, "+CMGW=" + int2str(pdu.size() / 2 - sz - 1), mrWelcome);
CString s = sendAt(ph, pdu, mrOk, CtrlZ);
/*
夏整痞 褕閑錶:
+CMGW: <瘟慮� �雛疑� 鋒��錚>
*/
int i = s.find(":") + 1;
int j = s.find(LF, i);
return str2int(s.sub(i, j - i));
}
bool gsm::smsRemove (Handle ph, int i)
{
writeModem(ph, "+CMGD=" + int2str(i));
CString s = readModem(ph);
ModemResult res = lastResult(ph);
if (res == mrError || res == mrCmsError) return false;
else if (res != mrOk)
{
sendModemError(portName(ph), lastWrite(ph), s, res == mrTimeout);
throw Error();
}
return true;
}
int gsm::smsSendPdu (Handle ph, const CString &pdu)
{
unsigned char hi = pdu[0], lo = pdu[1];
hi -= (hi >= '0' && hi <= '9') ? '0' : ((hi >= 'A' && hi <= 'F') ? 'A' - 10 : 'a' - 10);
lo -= (lo >= '0' && lo <= '9') ? '0' : ((lo >= 'A' && lo <= 'F') ? 'A' - 10 : 'a' - 10);
int sz = hi << 4 | lo;
sendAt(ph, "+CMGS=" + int2str(pdu.size() / 2 - sz - 1), mrWelcome);
CString s = sendAt(ph, pdu, mrOk, CtrlZ);
/*
夏整痞 褕閑錶:
+CMGS: <罹禳諄磋� 瘟慮� SMS>
*/
int i = s.find(":") + 1;
int j = s.find(LF, i);
return str2int(s.sub(i, j - i));
}