⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsmsmsstore.cc

📁 对各种手机进行编程的工具包源码gsmlib 1.9版本。
💻 CC
字号:
// *************************************************************************// * GSM TA/ME library// *// * File:    gsmsmsstore.cc// *// * Purpose: SMS store management program// *// * Author:  Peter Hofmann (software@pxh.de)// *// * Created: 4.8.1999// *************************************************************************#ifdef HAVE_CONFIG_H#include <gsm_config.h>#endif#include <gsmlib/gsm_nls.h>#include <string>#include <ctype.h>#ifdef WIN32#include <gsmlib/gsm_win32_serial.h>#else#include <gsmlib/gsm_unix_serial.h>#include <unistd.h>#endif#if defined(HAVE_GETOPT_LONG) || defined(WIN32)#include <getopt.h>#endif#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <gsmlib/gsm_me_ta.h>#include <gsmlib/gsm_util.h>#include <gsmlib/gsm_sorted_sms_store.h>#include <iostream>using namespace std;using namespace gsmlib;#ifdef HAVE_GETOPT_LONGstatic struct option longOpts[] ={  {"xonxoff", no_argument, (int*)NULL, 'X'},  {"init", required_argument, (int*)NULL, 'I'},  {"store", required_argument, (int*)NULL, 't'},  {"erase", no_argument, (int*)NULL, 'e'},  {"add", no_argument, (int*)NULL, 'a'},  {"list", no_argument, (int*)NULL, 'l'},  {"destination", required_argument, (int*)NULL, 'd'},  {"source", required_argument, (int*)NULL, 's'},  {"baudrate", required_argument, (int*)NULL, 'b'},  {"sca", required_argument, (int*)NULL, 'C'},  {"copy", no_argument, (int*)NULL, 'c'},  {"delete", no_argument, (int*)NULL, 'x'},  {"backup", no_argument, (int*)NULL, 'k'},  {"help", no_argument, (int*)NULL, 'h'},  {"version", no_argument, (int*)NULL, 'v'},  {"verbose", no_argument, (int*)NULL, 'V'},  {(char*)NULL, 0, (int*)NULL, 0}};#else#define getopt_long(argc, argv, options, longopts, indexptr) \  getopt(argc, argv, options)#endifbool verbose = false;           // true if --verbose option given// type of operation to performenum Operation {CopyOp = 'c', BackupOp = 'k', DeleteOp = 'x',                AddOp = 'a', ListOp = 'l', NoOp = 0};// aux function, insert entry only if not already present in destvoid backup(SortedSMSStoreRef destStore, SMSStoreEntry &entry){  // the following only works because we know that the default sort order  // is by date  assert(destStore->sortOrder() == ByDate);  Timestamp date = entry.message()->serviceCentreTimestamp();  pair<SortedSMSStore::iterator, SortedSMSStore::iterator> range =    destStore->equal_range(date);            for (SortedSMSStore::iterator j = range.first;       j != range.second; ++j)    if (entry == *j)      // do nothing if the entry is already present in the destination      return;  if (verbose)    cout << stringPrintf(_("inserting entry #%d from source into destination"),                         entry.index()) << endl         << entry.message()->toString();  destStore->insert(entry);     // insert}// aux function, throw exception if operation != NoOpvoid checkNoOp(Operation operation, int opt){  if (operation != NoOp)    throw GsmException(stringPrintf(_("incompatible options '%c' and '%c'"),                                    (char)operation, (char)opt),                       ParameterError);}// *** main programint main(int argc, char *argv[]){  try  {    // handle command line options    string destination;    string source;    string baudrate;    string storeName;    char operation = NoOp;    SortedSMSStoreRef sourceStore, destStore;    bool useIndices = false;    // use indices in delete, copy, backup op    string initString = DEFAULT_INIT_STRING;    bool swHandshake = false;    // service centre address (set on command line)    string serviceCentreAddress;    Ref<MeTa> sourceMeTa, destMeTa;    int opt;    int dummy;    while((opt = getopt_long(argc, argv, "I:t:s:d:b:cxlakhvVXC:",                             longOpts, &dummy))          != -1)      switch (opt)      {      case 'C':        serviceCentreAddress = optarg;        break;      case 'X':        swHandshake = true;        break;      case 'I':        initString = optarg;        break;      case 'V':        verbose = true;        break;      case 't':        storeName = optarg;        break;      case 'd':        destination = optarg;        break;      case 's':        source = optarg;        break;      case 'b':        baudrate = optarg;        break;      case 'c':        checkNoOp((Operation)operation, opt);        operation = CopyOp;        break;      case 'x':        checkNoOp((Operation)operation, opt);        operation = DeleteOp;        break;      case 'l':        checkNoOp((Operation)operation, opt);        operation = ListOp;        break;      case 'a':        checkNoOp((Operation)operation, opt);        operation = AddOp;        break;      case 'k':        checkNoOp((Operation)operation, opt);        operation = BackupOp;        break;      case 'v':        cerr << argv[0] << stringPrintf(_(": version %s [compiled %s]"),                                        VERSION, __DATE__) << endl;        exit(0);        break;      case 'h':        cerr << argv[0] << _(": [-a][-b baudrate][-c][-C sca]"                             "[-d device or file]\n"                             "  [-h][-I init string][-k][-l]"                             "[-s device or file]"                             "[-t SMS store name]\n  [-v][-V][-x][-X]"                             "{indices}|[phonenumber text]") << endl             << endl             << _("  -a, --add         add new SMS submit message\n"                  "                    (phonenumber and text) to destination")             << endl             << _("  -b, --baudrate    baudrate to use for device "                  "(default: 38400)")             << endl             << _("  -c, --copy        copy source entries to destination\n"                  "                    (if indices are given, "                  "copy only these entries)") << endl             << _("  -C, --sca         SMS service centre address") << endl             << _("  -d, --destination sets the destination device to\n"                  "                    connect to, or the file to write to")             << endl             << _("  -h, --help        prints this message") << endl             << _("  -I, --init        device AT init sequence") << endl             << _("  -k, --backup      backup new entries to destination\n"                  "                    (if indices are given, "                  "copy only these entries)") << endl             << _("  -l, --list        list source to stdout") << endl             << _("  -s, --source      sets the source device to connect to,\n"                  "                    or the file to read") << endl             << _("  -t, --store       name of SMS store to use") << endl             << _("  -v, --version     prints version and exits") << endl             << _("  -V, --verbose     print detailed progress messages")             << endl             << _("  -x, --delete      delete entries denoted by indices")             << endl             << _("  -X, --xonxoff     switch on software handshake") << endl             << endl;        exit(0);        break;      case '?':        throw GsmException(_("unknown option"), ParameterError);        break;      }    // check if parameters are complete    if (operation == NoOp)      throw GsmException(_("no operation option given"), ParameterError);    if (operation == BackupOp || operation == CopyOp)      if (destination.length() == 0 || source.length() == 0)        throw GsmException(_("both source and destination required"),                           ParameterError);    if (operation == ListOp)    {      if (destination.length() != 0)        throw GsmException(_("destination must not be given"), ParameterError);      if (source.length() == 0)        throw GsmException(_("source required"), ParameterError);    }    if (operation == AddOp || operation == DeleteOp)    {      if (source.length() != 0)        throw GsmException(_("source must not be given"), ParameterError);      if (destination.length() == 0)        throw GsmException(_("destination required"), ParameterError);    }    if (operation == CopyOp || operation == DeleteOp || operation == BackupOp)    {      // check if all indices are numbers      for (int i = optind; i < argc; ++i)        for (char *pp = argv[i]; *pp != 0; ++pp)          if (! isdigit(*pp))            throw GsmException(stringPrintf(_("expected number, got '%s'"),                                            argv[i]), ParameterError);      useIndices = optind != argc;    }    else if (operation == AddOp)    {      if (optind + 2 < argc)        throw GsmException(_("more than two parameters given"),                           ParameterError);      if (optind + 2 > argc)        throw GsmException(_("not enough parameters given"),                           ParameterError);    }    else      if (optind != argc)        throw GsmException(_("unexpected parameters"), ParameterError);        // start accessing source store or file if required by operation    if (operation == CopyOp || operation == BackupOp || operation == ListOp)      if (source == "-")        sourceStore = new SortedSMSStore(true);      else if (isFile(source))        sourceStore = new SortedSMSStore(source);      else      {        if (storeName == "")          throw GsmException(_("store name must be given"), ParameterError);                sourceMeTa = new MeTa(new#ifdef WIN32                              Win32SerialPort#else                              UnixSerialPort#endif                              (source,                               baudrate == "" ? DEFAULT_BAUD_RATE :                               baudRateStrToSpeed(baudrate), initString,                               swHandshake));        sourceStore = new SortedSMSStore(sourceMeTa->getSMSStore(storeName));      }          // make sure destination file exists    if (destination != "")    {      try      {        ofstream f(destination.c_str(), ios::out | ios::app | ios::binary);      }      catch (exception)      {      }    }    // start accessing destination destination store or file    if (operation == CopyOp || operation == BackupOp || operation == AddOp ||        operation == DeleteOp)      if (destination == "-")        destStore = new SortedSMSStore(false);      else if (isFile(destination))        destStore = new SortedSMSStore(destination);      else      {        if (storeName == "")          throw GsmException(_("store name must be given"), ParameterError);                destMeTa = new MeTa(new#ifdef WIN32                            Win32SerialPort#else                            UnixSerialPort#endif                            (destination,                             baudrate == "" ? DEFAULT_BAUD_RATE :                             baudRateStrToSpeed(baudrate), initString,                             swHandshake));        destStore = new SortedSMSStore(destMeTa->getSMSStore(storeName));            }    // now do the actual work    switch (operation)    {    case BackupOp:    {      sourceStore->setSortOrder(ByIndex); // needed in loop      if (useIndices)        for (int i = optind; i < argc; ++i)        {          SortedSMSStore::iterator j = sourceStore->find(atoi(argv[i]));          if (j == sourceStore->end())            throw GsmException(stringPrintf(_("no index '%s' in source"),                                            argv[i]), ParameterError);          backup(destStore, *j);        }      else        for (SortedSMSStore::iterator i = sourceStore->begin();             i != sourceStore->end(); ++i)          backup(destStore, *i);      break;    }    case CopyOp:    {                              destStore->clear();      if (! useIndices)         // copy all entries      {        for (SortedSMSStore::iterator i = sourceStore->begin();             i != sourceStore->end(); ++i)        {          if (verbose)            cout << stringPrintf(_("inserting entry #%d from source "                                   "into destination"), i->index()) << endl                 << i->message()->toString();          destStore->insert(*i);        }      }      else                      // copy indexed entries      {        sourceStore->setSortOrder(ByIndex); // needed in loop        for (int i = optind; i < argc; ++i)        {          SortedSMSStore::iterator j = sourceStore->find(atoi(argv[i]));          if (j == sourceStore->end())            throw GsmException(stringPrintf(_("no index '%s' in source"),                                            argv[i]), ParameterError);          if (verbose)            cout << stringPrintf(_("inserting entry #%d from source into "                                   "destination"), j->index()) << endl                 << j->message()->toString();          destStore->insert(*j);        }      }      break;    }    case ListOp:    {      for (SortedSMSStore::iterator i = sourceStore->begin();           i != sourceStore->end(); ++i)        cout << stringPrintf(_("index #%d"), i->index()) << endl             << i->message()->toString();      break;    }    case AddOp:    {      SMSMessageRef sms = new SMSSubmitMessage(argv[optind + 1], argv[optind]);      // set service centre address in new submit PDU if requested by user      if (serviceCentreAddress != "")      {        Address sca(serviceCentreAddress);        sms->setServiceCentreAddress(sca);      }      if (verbose)        cout << _("inserting new entry into destination") << endl             << sms->toString();      destStore->insert(sms);      break;    }    case DeleteOp:    {      destStore->setSortOrder(ByIndex);      for (int i = optind; i < argc; ++i)      {        int index = atoi(argv[i]);        if (verbose)        {          SortedSMSStore::iterator e = destStore->find(index);          if (e != destStore->end())            cout << stringPrintf(_("deleting entry #%d from destination"),                                 index) << endl                 << e->message()->toString();        }        if (destStore->erase(index) != 1)          throw GsmException(stringPrintf(_("no index '%s' in destination"),                                          argv[i]), ParameterError);      }      break;    }    }  }  catch (GsmException &ge)  {    cerr << argv[0] << _("[ERROR]: ") << ge.what() << endl;    return 1;  }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -