You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/kandy/src/atcommand.cpp

314 lines
7.4 KiB

/*
This file is part of Kandy.
Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
As a special exception, permission is given to link this program
with any edition of TQt, and distribute the resulting executable,
without including the source code for TQt in the source distribution.
*/
#include "atcommand.h"
#include <kdebug.h>
#include <tdelocale.h>
ATParameter::ATParameter()
{
mUserInput = false;
}
ATParameter::ATParameter(const TQString &value,const TQString &name,
bool userInput)
{
mName = name;
mValue = value;
mUserInput = userInput;
}
ATCommand::ATCommand()
{
mHexOutput = false;
construct();
}
ATCommand::ATCommand(const TQString &cmdString)
{
setCmdName(i18n("New Command"));
setCmdString(cmdString);
mHexOutput = false;
extractParameters();
construct();
}
ATCommand::ATCommand(const TQString &cmdName,const TQString &cmdString,
bool hexOutput)
{
setCmdName(cmdName);
setCmdString(cmdString);
mHexOutput = hexOutput;
construct();
}
void ATCommand::construct()
{
mAutoDelete = false;
mResultFieldsList.setAutoDelete(true);
mParameters.setAutoDelete(true);
}
ATCommand::~ATCommand()
{
// kdDebug() << "~ATCommand: " << cmdString() << endl;
}
void ATCommand::setCmdName(const TQString &cmdName)
{
mCmdName = cmdName;
}
TQString ATCommand::cmdName()
{
return mCmdName;
}
void ATCommand::setCmdString(const TQString &cmdString)
{
mCmdString = cmdString;
mId = cmdString;
if (mId.startsWith("at")) mId = mId.mid(2);
else mCmdString.prepend("at");
// kdDebug() << "ATCommand: Id: " << mId << endl;
}
TQString ATCommand::cmdString()
{
return mCmdString;
}
TQString ATCommand::cmd()
{
if (mParameters.count() > 0) {
TQString cmd = cmdString().left(cmdString().find("=") + 1);
// kdDebug() << "--1-cmd: " << cmd << endl;
for(uint i=0;i<mParameters.count();++i) {
cmd += mParameters.at(i)->value();
if (i < mParameters.count() - 1) cmd += ",";
}
// kdDebug() << "--2-cmd: " << cmd << endl;
return cmd;
} else {
return cmdString();
}
}
TQString ATCommand::id()
{
return mId;
}
void ATCommand::setHexOutput(bool hexOutput)
{
mHexOutput = hexOutput;
}
bool ATCommand::hexOutput()
{
return mHexOutput;
}
void ATCommand::setResultString(const TQString &resultString)
{
mResultString = resultString;
mResultFieldsList.clear();
TQStringList resultFields = TQStringList::split("\n",mResultString);
for(TQStringList::Iterator it = resultFields.begin();
it != resultFields.end(); ++it) {
setResultFields(*it);
}
}
void ATCommand::setResultFields( TQString fieldsString )
{
TQString id = mId.upper().left( mId.find( '=' ) );
// Truncate the command name prepended to the output by the modem.
if ( fieldsString.startsWith( id ) )
fieldsString = fieldsString.mid( id.length() + 2 );
// If modem output is enclosed by brackets, remove them, too
if ( ( fieldsString[ 0 ] == '(' ) && ( fieldsString[ fieldsString.length() - 1 ] == ')' ) )
fieldsString = fieldsString.mid( 1, fieldsString.length() - 2 );
TQStringList *fields = new TQStringList;
TQStringList TmpFields = TQStringList::split( ',', fieldsString );
TQString TmpString = "";
// Assume a phonebook entry of the mobile phone has the format
// <familyname>, <givenname>
// Then, the above split() call separtes this entry into 2 distinct fields
// leading to an error in MobileGui::fillPhonebook since the number of
// fields is != 4.
// Hence, the fieldsString needs to be parsed a little bit. Names stored on
// the mobile phone are quoted. Commas within a quoted are of the fieldsString
// must not be divided into differend fields.
for ( TQStringList::Iterator it = TmpFields.begin(); it != TmpFields.end(); it++ )
{
// Start of a quoted area
if ( ( (*it)[ 0 ] == '\"' ) && ( (*it)[ (*it).length() - 1 ] != '\"' ) )
TmpString = (*it).copy();
else
// End of a quoted area
if ( ( (*it)[ 0 ] != '\"' ) && ( (*it)[ (*it).length() - 1 ] == '\"' ) )
{
TmpString += "," + (*it).copy();
(*fields).append( TmpString.copy() );
TmpString = "";
} else
// Not within a quoted area
if (TmpString.isEmpty())
(*fields).append( *it );
else
// Within a quoted area
TmpString += "," + (*it).copy();
}
mResultFieldsList.append( fields );
}
TQString ATCommand::resultString()
{
return mResultString;
}
TQString ATCommand::resultField(int index)
{
if (mResultFieldsList.count() == 0) return "";
TQStringList *resultFields = mResultFieldsList.at(0);
TQStringList::Iterator it = resultFields->at(index);
if (it == resultFields->end()) {
kdDebug() << "ATCommand::resultField: index " << index << " out of range."
<< endl;
return "";
}
return *it;
}
TQPtrList<TQStringList> *ATCommand::resultFields()
{
return &mResultFieldsList;
}
void ATCommand::addParameter(ATParameter *p)
{
mParameters.append(p);
}
void ATCommand::clearParameters()
{
mParameters.clear();
}
TQPtrList<ATParameter> ATCommand::parameters()
{
return mParameters;
}
void ATCommand::setParameter(int index,const TQString &value)
{
if (mParameters.count() <= (unsigned int)index) {
kdDebug() << "ATCommand " << cmdName() << " has no Parameter " << index
<< endl;
return;
}
mParameters.at(index)->setValue(value);
}
void ATCommand::setParameter(int index,int value)
{
setParameter(index,TQString::number(value));
}
TQString ATCommand::processOutput(const TQString &output)
{
if (hexOutput()) {
TQString hexString = output.mid(output.find('\n')+1);
int i=0;
TQString aChar = hexString.mid(i,2);
TQString result;
while(!aChar.isEmpty()) {
int charValue = aChar.toInt(0,16);
TQChar charEncoded(charValue);
// result += aChar + ": " + charEncoded + "\n";
result += charEncoded;
i += 2;
aChar = hexString.mid(i,2);
}
result += "\n";
return result;
} else {
return output;
}
}
TQString ATCommand::processOutput()
{
return processOutput(mResultString);
}
void ATCommand::extractParameters()
{
// kdDebug() << "Arg String: " << cmdString() << endl;
int pos = cmdString().find("=");
if (pos < 0) return;
TQString paraString = cmdString().mid(pos+1);
// kdDebug() << "Para String: " << paraString << endl;
TQStringList paraList = TQStringList::split(",",paraString);
TQStringList::ConstIterator it = paraList.begin();
TQStringList::ConstIterator end = paraList.end();
int argNum = 1;
while(it != end) {
addParameter(new ATParameter(*it,i18n("Arg %1").arg(TQString::number(argNum++)),
false));
++it;
}
}