/*
* Copyright (C) 2010-2011 Dmitry Petuhov
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package org.pvoid.apteryxaustralis.storage.osmp;
import android.util.Log;
import org.pvoid.apteryxaustralis.types.Account;
import org.pvoid.apteryxaustralis.types.Group;
import org.pvoid.apteryxaustralis.net.Request;
import org.pvoid.apteryxaustralis.storage.IStorage;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.TimeZone;
public class OsmpRequest
{
private static final URL _sNewApiURL;
private static final URL _sOldApiURL;
private static final int _sOffset;
private static final SAXParserFactory _sSAXFactory = SAXParserFactory.newInstance();
static
{
/////// Создадим URL для запросов к новому API
URL url;
try
{
url = new URL("https://service1.osmp.ru/xmlgate/xml.jsp");
}
catch(MalformedURLException e)
{
e.printStackTrace();
url = null;
}
_sNewApiURL = url;
/////// Создадим URL для запросов к прежнему API
try
{
url = new URL("http://xml1.osmp.ru/term2/xml.jsp");
}
catch(MalformedURLException e)
{
e.printStackTrace();
url = null;
}
_sOldApiURL = url;
/////// Получим локальное смещение временное
TimeZone zone = TimeZone.getDefault();
_sOffset = zone.getOffset(System.currentTimeMillis())/3600000;
}
static private void startRequestNew(StringBuilder request, Account account)
{
request.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
"<request>"+
"<auth login=\"");
request.append(account.login);
request.append("\" sign=\"");
request.append(account.passwordHash);
request.append("\" signAlg=\"MD5\"/><client terminal=\"");
request.append(account.terminal);
request.append("\" software=\"Dealer v0\" timezone=\"GMT");
//////////
if(_sOffset>0)
request.append('+');
request.append(_sOffset);
request.append("\"/>");
}
static private void startRequestOld(StringBuilder request,Account account,int requestType, boolean fullRequest)
{
request.append("<?xml version=\"1.0\" encoding=\"windows-1251\"?><request><protocol-version>3.00</protocol-version>")
.append("<request-type>").append(requestType).append("</request-type>")
.append("<terminal-id>").append(account.terminal).append("</terminal-id>")
.append("<extra name=\"login\">").append(account.login).append("</extra>")
.append("<extra name=\"password-md5\">").append(account.passwordHash).append("</extra>")
.append("<extra name=\"client-software\">Dealer v1.9</extra>");
////////
if(fullRequest)
{
request.append("<extra name=\"cashs\">true</extra><extra name=\"statistics\">true</extra>");
}
request.append("</request>");
}
static protected int checkAccount(Account account, List<Group> groups)
{
StringBuilder data = new StringBuilder();
startRequestNew(data,account);
/////// попросим также информацию об агенте
data.append("<agents><getAgentInfo/><getAgents/></agents></request>");
/////// и что же нам ответили
Request.Response response = Request.Send(_sNewApiURL,data.toString(),"utf-8");
if(response==null)
return IStorage.RES_ERR_NETWORK_ERROR;
///////
if(response.code!=200)
return -response.code;
///////
ResponseParser parser = new ResponseParser();
parser.setAccount(account).setGroups(groups);
if(!parseResponse(parser,response))
return IStorage.RES_ERR_INCORRECT_RESPONSE;
///////
return parser.getAccountResult();
}
static protected int getBalances(Account account, List<Group> groups)
{
StringBuilder data = new StringBuilder();
startRequestNew(data,account);
data.append("<agents>");
/////// добавим в запрос агентов, для получения балансов
for(Group group : groups)
{
data.append("<getBalance><target-agent>").append(group.id).append("</target-agent></getBalance>");
}
data.append("</agents></request>");
/////// и что же нам ответили
Request.Response response = Request.Send(_sNewApiURL,data.toString(),"utf-8");
if(response==null)
return IStorage.RES_ERR_NETWORK_ERROR;
///////
if(response.code!=200)
return -response.code;
///////
ResponseParser parser = new ResponseParser();
parser.setGroups(groups);
if(!parseResponse(parser,response))
return IStorage.RES_ERR_INCORRECT_RESPONSE;
///////
return 0;
}
static protected int rebootTerminal(Account account, long terminalId)
{
StringBuilder data = new StringBuilder();
startRequestNew(data,account);
data.append("<terminals><rebootTerminal><target-terminal>")
.append(terminalId)
.append("</target-terminal></rebootTerminal></terminals></request>");
Log.v(OsmpRequest.class.getSimpleName(),data.toString());
Request.Response response = Request.Send(_sNewApiURL,data.toString(),"utf-8");
if(response==null)
return IStorage.RES_ERR_NETWORK_ERROR;
///////
if(response.code!=200)
return -response.code;
return IStorage.RES_OK;
}
static protected int switchOffTerminal(Account account, long terminalId)
{
StringBuilder data = new StringBuilder();
startRequestNew(data,account);
data.append("<terminals><disableTerminal><target-terminal>")
.append(terminalId)
.append("</target-terminal></disableTerminal></terminals></request>");
Log.v(OsmpRequest.class.getSimpleName(),data.toString());
Request.Response response = Request.Send(_sNewApiURL,data.toString(),"utf-8");
if(response==null)
return IStorage.RES_ERR_NETWORK_ERROR;
///////
if(response.code!=200)
return -response.code;
return IStorage.RES_OK;
}
static protected int getTerminals(Account account, List<Terminal> terminals)
{
StringBuilder data = new StringBuilder();
startRequestOld(data, account, 16, true);
//////////
Request.Response response = Request.Send(_sOldApiURL,data.toString(),"windows-1251");
if(response==null)
return IStorage.RES_ERR_NETWORK_ERROR;
/////////
if(response.code!=200)
return -response.code;
///////
ResponseParser parser = new ResponseParser();
parser.setTerminals(terminals);
if(!parseResponse(parser,response))
return IStorage.RES_ERR_INCORRECT_RESPONSE;
///////
return 0;
}
protected static boolean parseResponse(ResponseParser parser, Request.Response response)
{
try
{
SAXParser saxParser = _sSAXFactory.newSAXParser();
InputSource source = new InputSource();
ByteArrayInputStream stream;
try
{
stream = new ByteArrayInputStream(response.data.getBytes("UTF-8"));
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
return false;
}
source.setByteStream(stream);
source.setEncoding("UTF-8");
saxParser.parse(source,parser);
////////
return true;
}
catch(ParserConfigurationException e)
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
catch(SAXException e)
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
catch(IOException e)
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
////////
return false;
}
}