📄 gsmpb.c
字号:
string phonebook;
SortedPhonebookRef sourcePhonebook, destPhonebook;
bool verbose = false;
bool indexed = false;
string initString = DEFAULT_INIT_STRING;
bool swHandshake = false;
string charSet;
Ref<MeTa> sourceMeTa, destMeTa;
int opt;
int dummy;
while((opt = getopt_long(argc, argv, "I:p:s:d:b:cyhvViD:S:Xt:", longOpts,
&dummy))
!= -1)
switch (opt)
{
case 'X':
swHandshake = true;
break;
case 'I':
initString = optarg;
break;
case 'V':
verbose = true;
break;
case 'p':
phonebook = optarg;
break;
case 'd':
destination = optarg;
break;
case 's':
source = optarg;
break;
case 'D':
destinationBackend = optarg;
break;
case 'S':
sourceBackend = optarg;
break;
case 'b':
baudrate = optarg;
break;
case 't':
charSet = optarg;
break;
case 'c':
doSynchronize = false;
break;
case 'i':
indexed = true;
break;
case 'y':
doSynchronize = true;
break;
case 'v':
cerr << argv[0] << stringPrintf(_(": version %s [compiled %s]"),
VERSION, __DATE__) << endl;
exit(0);
break;
case 'h':
cerr << argv[0] << _(": [-b baudrate][-c][-d device or file][-h]"
"[-I init string]\n"
" [-p phonebook name][-s device or file]"
"[-t charset][-v]"
"[-V][-y][-X]") << endl
<< endl
<< _(" -b, --baudrate baudrate to use for device "
"(default: 38400)")
<< endl
<< _(" -c, --copy copy source entries to destination")
<< endl
<< _(" -d, --destination sets the destination device to "
"connect \n"
" to, or the file to write") << endl
<< _(" -D, --destination-backend sets the destination backend")
<< endl
<< _(" -h, --help prints this message") << endl
<< _(" -i, --index takes index positions into account")
<< endl
<< _(" -I, --init device AT init sequence") << endl
<< _(" -p, --phonebook name of phonebook to use") << endl
<< _(" -s, --source sets the source device to connect to,\n"
" or the file to read") << endl
<< _(" -t, --charset sets the character set to use for\n"
" phonebook entries") << endl
<< _(" -S, --source-backend sets the source backend")
<< endl
<< _(" -v, --version prints version and exits") << endl
<< _(" -V, --verbose print detailed progress messages")
<< endl
<< _(" -X, --xonxoff switch on software handshake") << endl
<< _(" -y, --synchronize synchronize destination with source\n"
" entries (destination is overwritten)\n"
" (see gsmpb(1) for details)")
<< endl << endl;
exit(0);
break;
case '?':
throw GsmException(_("unknown option"), ParameterError);
break;
}
// check if all parameters all present
if (destination == "" || source == "")
throw GsmException(_("both source and destination must be given"),
ParameterError);
// start accessing source mobile phone or file
if (sourceBackend != "")
sourcePhonebook =
CustomPhonebookRegistry::createPhonebook(sourceBackend, source);
else if (source == "-")
sourcePhonebook = new SortedPhonebook(true, indexed);
else if (isFile(source))
sourcePhonebook = new SortedPhonebook(source, indexed);
else
{
if (phonebook == "")
throw GsmException(_("phonebook name must be given"), ParameterError);
sourceMeTa = new MeTa(new
#ifdef WIN32
Win32SerialPort
#else
UnixSerialPort
#endif
(source,
baudrate == "" ? DEFAULT_BAUD_RATE :
baudRateStrToSpeed(baudrate), initString,
swHandshake));
if (charSet != "")
sourceMeTa->setCharSet(charSet);
sourcePhonebook =
new SortedPhonebook(sourceMeTa->getPhonebook(phonebook));
}
// make sure destination.c_str file exists
if (destination != "")
{
try
{
ofstream f(destination.c_str(), ios::out | ios::app);
}
catch (exception)
{
}
}
// start accessing destination mobile phone or file
if (destinationBackend != "")
destPhonebook =
CustomPhonebookRegistry::createPhonebook(destinationBackend,
destination);
else if (destination == "-")
destPhonebook = new SortedPhonebook(false, indexed);
else if (isFile(destination))
destPhonebook = new SortedPhonebook(destination, indexed);
else
{
if (phonebook == "")
throw GsmException(_("phonebook name must be given"), ParameterError);
destMeTa = new MeTa(new
#ifdef WIN32
Win32SerialPort
#else
UnixSerialPort
#endif
(destination,
baudrate == "" ? DEFAULT_BAUD_RATE :
baudRateStrToSpeed(baudrate), initString,
swHandshake));
if (charSet != "")
destMeTa->setCharSet(charSet);
PhonebookRef destPb = destMeTa->getPhonebook(phonebook);
// check maximum lengths of source text and phonenumber when writing to
// mobile phone
unsigned int maxTextLen = destPb->getMaxTextLen();
unsigned int maxTelLen = destPb->getMaxTelephoneLen();
for (SortedPhonebookBase::iterator i = sourcePhonebook->begin();
i != sourcePhonebook->end(); ++i)
if (i->text().length() > maxTextLen)
throw GsmException(
stringPrintf(_("text '%s' is too large to fit into destination "
"(maximum size %d characters)"),
i->text().c_str(), maxTextLen),
ParameterError);
else if (i->telephone().length() > maxTelLen)
throw GsmException(
stringPrintf(_("phone number '%s' is too large to fit into "
"destination (maximum size %d characters)"),
i->telephone().c_str(), maxTelLen),
ParameterError);
// read phonebook
destPhonebook = new SortedPhonebook(destPb);
}
// now do the actual work
if (doSynchronize)
{ // synchronizing
if (indexed)
{
sourcePhonebook->setSortOrder(ByIndex);
destPhonebook->setSortOrder(ByIndex);
// for an explanation see below
updateEntriesIndexed(sourcePhonebook, destPhonebook, verbose);
deleteNotPresent(sourcePhonebook, destPhonebook, true, verbose);
insertNotPresent(sourcePhonebook, destPhonebook, true, verbose);
}
else
{
sourcePhonebook->setSortOrder(ByText);
destPhonebook->setSortOrder(ByText);
// the following is done to avoid superfluous writes to the TA
// (that takes time) and keep updated (ie. telephone number changed)
// entries at the same place
// 1. update entries in place where just the number changed
updateEntries(sourcePhonebook, destPhonebook, verbose);
// 2. delete those that are not present anymore
deleteNotPresent(sourcePhonebook, destPhonebook, false, verbose);
// 3. insert the new ones
insertNotPresent(sourcePhonebook, destPhonebook, false, verbose);
}
}
else
{ // copying
destPhonebook->clear();
for (SortedPhonebookBase::iterator i = sourcePhonebook->begin();
i != sourcePhonebook->end(); ++i)
{
if (verbose)
{
cout << stringPrintf(_("inserting '%s' tel# %s"),
i->text().c_str(), i->telephone().c_str());
if (indexed)
cout << stringPrintf(_(" (index #%d)"), i->index());
cout << endl;
}
destPhonebook->insert(*i);
}
}
}
catch (GsmException &ge)
{
cerr << argv[0] << _("[ERROR]: ") << ge.what() << endl;
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -