diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index cc361ec..4c1ce2e 100755 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -19,22 +19,29 @@ + android:versionName="0.5" android:versionCode="6"> - + + + + + - \ No newline at end of file + + + \ No newline at end of file diff --git a/android/res/layout/main.xml b/android/res/layout/main.xml index 7adda75..559aaaf 100755 --- a/android/res/layout/main.xml +++ b/android/res/layout/main.xml @@ -58,6 +58,10 @@ android:layout_below="@+id/save" android:id="@+id/pp_only" android:layout_height="wrap_content" android:layout_toRightOf="@+id/TextView01"> + + diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index 63fe032..38e1e53 100755 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -19,12 +19,14 @@ Page Plus Balance - No Data Yet\nBalance:\nPlan:\nMinutes:\nTexts:\nData:\n + Balance:\nPlan:\nMinutes:\nSMS:\nData:\nLast Updated: Never\n Username: Password: Phone name: - Save / Grab Data + Save / Grab Data via website - Use only pageplus\' website (uses significantly more data) + Use only pagepluscellular.com (uses significantly more data) + + Grab Data via SMS diff --git a/android/src/main/java/org/moparisthebest/pageplus/AndroidPPInfo.java b/android/src/main/java/org/moparisthebest/pageplus/AndroidPPInfo.java deleted file mode 100755 index 0b8032e..0000000 --- a/android/src/main/java/org/moparisthebest/pageplus/AndroidPPInfo.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * PagePlusBalance retrieves your balance from PagePlusCellular.com, currently for android phones. - * Copyright (C) 2013 Travis Burtrum (moparisthebest) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.moparisthebest.pageplus; - -import android.content.Context; -import android.content.SharedPreferences; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import org.moparisthebest.pageplus.plugins.PPInfo; - -public class AndroidPPInfo { - - private Context parent; - - public AndroidPPInfo(Context parent) { - this.parent = parent; - } - - public void grabData() throws Exception { - NetworkInfo netInfo = (NetworkInfo) ((ConnectivityManager) parent - .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); - - if (netInfo == null || !netInfo.isConnected() || netInfo.isRoaming()) - return; - - SharedPreferences settings = parent.getSharedPreferences(Main.PREFS_NAME, 0); - - PPInfo pp; - - if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE && !settings.getBoolean(Main.PP_ONLY, false)) - pp = (PPInfo) new org.moparisthebest.pageplus.plugins.PPServer(); - else // we are connected with wifi? - pp = (PPInfo) new org.moparisthebest.pageplus.plugins.PagePlusHTTP(); - - String user = settings.getString(Main.USER, Main.EMPTY); - if (user.equals(Main.EMPTY)) - throw new Exception("Username cannot be empty."); - String pass = settings.getString(Main.PASS, Main.EMPTY); - if (pass.equals(Main.EMPTY)) - throw new Exception("Password cannot be empty."); - String phone = settings.getString(Main.PHONE, Main.EMPTY); - // phone could be empty, I guess... - - pp.grabData(user, pass, phone); - SharedPreferences.Editor editor = settings.edit(); - for (int x = 0; x < pp.names.length; ++x) - editor.putString(pp.names[x], pp.info[x]); - editor.commit(); - } - -} diff --git a/android/src/main/java/org/moparisthebest/pageplus/Main.java b/android/src/main/java/org/moparisthebest/pageplus/Main.java index 28e7f3e..8b41d23 100755 --- a/android/src/main/java/org/moparisthebest/pageplus/Main.java +++ b/android/src/main/java/org/moparisthebest/pageplus/Main.java @@ -20,10 +20,11 @@ package org.moparisthebest.pageplus; import android.app.Activity; import android.app.ProgressDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; +import android.content.*; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.os.Bundle; +import android.telephony.SmsManager; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; @@ -31,21 +32,36 @@ import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.TextView; - -import java.util.Date; +import org.moparisthebest.pageplus.dto.Balance; +import org.moparisthebest.pageplus.plugins.PPInfo; public class Main extends Activity { public static final String PREFS_NAME = "page_plus", USER = "user", PASS = "pass", - PHONE = "phone", ERROR = "error", DATE = "date", PP_ONLY = "pp_only", EMPTY = ""; + PHONE = "phone", PP_ONLY = "pp_only", EMPTY = ""; + + public static final String PP_BAL_RECEIVED_ACTION = "PP_BAL_RECEIVED_ACTION"; + public static final String BALANCE = "BALANCE_COMPACT"; - private Button closeButton; private EditText username, password, phone; private CheckBox pp_only; private TextView plan_data; private SharedPreferences settings; private Context thisContext; + private ProgressDialog pd; + + private IntentFilter intentFilter; + private BroadcastReceiver intentReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + populateData(intent.getExtras().getString(BALANCE)); + if (pd != null && pd.isShowing()) + pd.dismiss(); + } + }; + + /** * Called when the activity is first created. */ @@ -66,7 +82,7 @@ public class Main extends Activity { this.settings = getSharedPreferences(PREFS_NAME, 0); - populate_data(); + populateData(); this.username.setText(this.settings.getString(USER, EMPTY)); this.password.setText(this.settings.getString(PASS, EMPTY)); @@ -74,8 +90,21 @@ public class Main extends Activity { this.pp_only.setChecked(this.settings.getBoolean(PP_ONLY, false)); - this.closeButton = (Button) this.findViewById(R.id.save); - this.closeButton.setOnClickListener(new OnClickListener() { + this.pd = new ProgressDialog(thisContext); + pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); + pd.setIndeterminate(true); + /* + pd.setOnDismissListener(new DialogInterface.OnDismissListener() { + public void onDismiss(DialogInterface dialog) { + populateData(); + } + });*/ + + intentFilter = new IntentFilter(); + intentFilter.addAction(PP_BAL_RECEIVED_ACTION); + + Button saveButton = (Button) this.findViewById(R.id.save); + saveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final SharedPreferences.Editor editor = settings.edit(); @@ -90,37 +119,44 @@ public class Main extends Activity { editor.commit(); try { - final ProgressDialog pd = new ProgressDialog(thisContext); - pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); pd.setTitle("Grabbing data..."); pd.setMessage("be patient"); - pd.setIndeterminate(true); - pd.setOnDismissListener(new DialogInterface.OnDismissListener() { - public void onDismiss(DialogInterface dialog) { - populate_data(); - } - }); pd.show(); // final Handler pdHandler = new Handler(); new Thread(new Runnable() { public void run() { - - try { - new AndroidPPInfo(thisContext).grabData(); - editor.putString(DATE, new Date().toLocaleString()); - editor.remove(ERROR); - } catch (Exception e) { - // TODO Auto-generated catch block - //e.printStackTrace(); - editor.putString(ERROR, e.getMessage()); - } - editor.commit(); - - - pd.dismiss(); + Balance balance = getBalance(); + Intent broadcastIntent = new Intent(); + broadcastIntent.setAction(Main.PP_BAL_RECEIVED_ACTION); + broadcastIntent.putExtra(Main.BALANCE, balance == null ? null : balance.compactFormat()); + thisContext.sendBroadcast(broadcastIntent); } }).start(); + } catch (Exception e) { + // grabbing data failed + // currently we just ignore this and go with the last data + //e.printStackTrace(); + Log.i("PagePlus", Log.getStackTraceString(e)); + } + } + }); + + Button smsButton = (Button) this.findViewById(R.id.sms); + smsButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + try { + pd.setTitle("Sending SMS..."); + pd.setMessage("and waiting for reply, be patient"); + pd.show(); + // final Handler pdHandler = new Handler(); + new Thread(new Runnable() { + public void run() { + SmsManager sms = SmsManager.getDefault(); + sms.sendTextMessage("7243", null, "BAL", null, null); + } + }).start(); } catch (Exception e) { // grabbing data failed // currently we just ignore this and go with the last data @@ -133,6 +169,46 @@ public class Main extends Activity { } + @Override + protected void onResume() { + registerReceiver(intentReceiver, intentFilter); + super.onResume(); + } + + @Override + protected void onPause() { + unregisterReceiver(intentReceiver); + super.onPause(); + } + + private Balance getBalance() { + NetworkInfo netInfo = ((ConnectivityManager) thisContext.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); + + if (netInfo == null || !netInfo.isConnected() || netInfo.isRoaming()) + return null; + + SharedPreferences settings = thisContext.getSharedPreferences(Main.PREFS_NAME, 0); + + String user = settings.getString(Main.USER, Main.EMPTY); + if (user.equals(Main.EMPTY)) + return new Balance().setError("Username cannot be empty."); + String pass = settings.getString(Main.PASS, Main.EMPTY); + if (pass.equals(Main.EMPTY)) + return new Balance().setError("Password cannot be empty."); + String phone = settings.getString(Main.PHONE, Main.EMPTY); + // phone could be empty, I guess... + + PPInfo pp; + + if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE && !settings.getBoolean(Main.PP_ONLY, false)) + pp = new org.moparisthebest.pageplus.plugins.PPServer(); + else // we are connected with wifi + pp = new org.moparisthebest.pageplus.plugins.PagePlusHTTP(); + + return pp.grabData(user, pass, phone); + } + + public static void trim_input(EditText et) { trim_input(et, false); } @@ -141,15 +217,25 @@ public class Main extends Activity { et.setText(toLowerCase ? et.getText().toString().trim().toLowerCase() : et.getText().toString().trim()); } - private void populate_data() { - String data = ""; - settings = getSharedPreferences(PREFS_NAME, 0); - // if there was an error, put that first: - if (settings.contains(ERROR)) - data += "Error: " + settings.getString(ERROR, EMPTY) + "\nPrevious data:\n"; - for (int x = 0; x < org.moparisthebest.pageplus.plugins.PPInfo.names.length; ++x) - data += org.moparisthebest.pageplus.plugins.PPInfo.names[x] + ": " + settings.getString(org.moparisthebest.pageplus.plugins.PPInfo.names[x], EMPTY) + "\n"; - data += "Last Updated: " + settings.getString(DATE, EMPTY) + "\n"; - plan_data.setText(data); + private synchronized void populateData(String balanceCompact) { + SharedPreferences.Editor editor = settings.edit(); + Balance balance = new Balance(balanceCompact); + if (balance.error != null) { + // then there was an error and we want to save some info from the last successful attempt + balanceCompact = settings.getString(BALANCE, null); + if (balanceCompact != null) + balanceCompact = balance.copyFrom(new Balance(balanceCompact)).compactFormat(); + } + editor.putString(BALANCE, balanceCompact); + editor.commit(); + populateData(balance); + } + + private synchronized void populateData(Balance balance) { + plan_data.setText(balance.toString()); + } + + private synchronized void populateData() { + populateData(new Balance(settings.getString(BALANCE, EMPTY))); } } \ No newline at end of file diff --git a/android/src/main/java/org/moparisthebest/pageplus/SMSReceiver.java b/android/src/main/java/org/moparisthebest/pageplus/SMSReceiver.java new file mode 100644 index 0000000..7680fbe --- /dev/null +++ b/android/src/main/java/org/moparisthebest/pageplus/SMSReceiver.java @@ -0,0 +1,77 @@ +package org.moparisthebest.pageplus; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.telephony.SmsMessage; +import org.moparisthebest.pageplus.dto.Balance; + +public class SMSReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Bundle bundle = intent.getExtras(); + if (bundle == null) + return; + + Object[] pdus = (Object[]) bundle.get("pdus"); + for (int i = 0; i < pdus.length; ++i) { + SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[i]); + if (!"7243".equals(msg.getOriginatingAddress())) + continue; + // it's a message from Page Plus, but is it a balance message? + String message = msg.getMessageBody(); + if (message == null || !message.startsWith("Balance:")) + continue; + // it IS a balance message, get to parsing... + try { + // split string by newlines + final String[] msgLines = message.split("\n"); + final Balance balance = new Balance(); + final String regexStrip = "^[^:]*: "; + // get balance + balance.info[0] = String.format("%s (expires %s)", + msgLines[0].replaceFirst(regexStrip, ""), + msgLines[1].replaceFirst(regexStrip, "")); + // get plan + balance.info[1] = String.format("%s (expires %s)", + msgLines[2], + msgLines[3].replaceFirst(regexStrip, "")); + // get minutes + balance.info[2] = msgLines[4].replaceFirst(regexStrip, ""); + // get text + balance.info[3] = msgLines[5].replaceFirst(regexStrip, ""); + // get data + balance.info[4] = msgLines[6].replaceFirst(regexStrip, ""); + + // test + //android.widget.Toast.makeText(context, balance.toString(), android.widget.Toast.LENGTH_SHORT).show(); + + //---send a broadcast intent to update the SMS received in the activity--- + Intent broadcastIntent = new Intent(); + broadcastIntent.setAction(Main.PP_BAL_RECEIVED_ACTION); + broadcastIntent.putExtra(Main.BALANCE, balance.success().compactFormat()); + context.sendBroadcast(broadcastIntent); + +/* + // now save them + SharedPreferences settings = Main.getMainContext().getSharedPreferences(Main.PREFS_NAME, 0); + SharedPreferences.Editor editor = settings.edit(); + + for (int x = 0; x < PPInfo.names.length; ++x) + editor.putString(PPInfo.names[x], info[x]); + + editor.putString(Main.DATE, new Date().toLocaleString()); + editor.remove(Main.ERROR); + editor.commit(); + Main.getMainContext().populateData(); + */ + } catch (Exception e) { + //e.printStackTrace(); + //editor.putString(ERROR, e.getMessage()); + } + //editor.commit(); + } + } +} \ No newline at end of file diff --git a/plugins/src/main/java/org/moparisthebest/pageplus/dto/Balance.java b/plugins/src/main/java/org/moparisthebest/pageplus/dto/Balance.java new file mode 100644 index 0000000..7754350 --- /dev/null +++ b/plugins/src/main/java/org/moparisthebest/pageplus/dto/Balance.java @@ -0,0 +1,90 @@ +package org.moparisthebest.pageplus.dto; + +import java.util.Date; + +public class Balance { + private static final String[] names = new String[]{"Balance", "Plan", "Minutes", "SMS", "Data"}; + private static String compactFormatDelim = "\n"; + + public final String[] info = new String[names.length]; + public String error = null; + public Date successDate = null; + + public Balance() { + } + + public Balance(final String compactFormat) { + if (compactFormat == null || compactFormat.isEmpty()) + return; + String[] split = compactFormat.split(compactFormatDelim); + //System.out.println("compactFormat: " + compactFormat); + //System.out.println("split: " + java.util.Arrays.toString(split)); + int x = 0; + for (; x < info.length; ++x) + info[x] = nullForEmpty(split[x]); + if (x < split.length) + error = nullForEmpty(split[x++]); + if (x < split.length) + try { + String date = nullForEmpty(split[x++]); + if (date != null) + successDate = new Date(Long.parseLong(date)); + } catch (Throwable e) { + // do nothing + } + } + + public String compactFormat() { + StringBuilder sb = new StringBuilder(); + for (String str : info) { + if (str != null) + sb.append(str); + sb.append(compactFormatDelim); + } + if (error != null) + sb.append(error); + sb.append(compactFormatDelim); + if (successDate != null) + sb.append(successDate.getTime()); + return sb.toString(); + } + + private static String nullForEmpty(String s) { + return (s == null || s.isEmpty()) ? null : s; + } + + public Balance copyFrom(Balance lastSuccessful) { + System.arraycopy(lastSuccessful.info, 0, this.info, 0, this.info.length); + this.successDate = lastSuccessful.successDate; + return this; + } + + public Balance setError(String error) { + this.error = error; + successDate = null; + return this; + } + + public Balance success() { + successDate = new Date(); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (error != null) + sb.append("Error: ").append(error).append("\nPrevious data:\n"); + for (int x = 0; x < info.length; ++x) { + sb.append(names[x]).append(": "); + if (info[x] != null) + sb.append(info[x]); + sb.append("\n"); + } + sb.append("Last Updated: "); + if (successDate != null) + sb.append(successDate.toString()); + sb.append("\n"); + return sb.toString(); + } +} diff --git a/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPInfo.java b/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPInfo.java index 500a10f..633aee5 100755 --- a/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPInfo.java +++ b/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPInfo.java @@ -18,15 +18,14 @@ package org.moparisthebest.pageplus.plugins; +import org.moparisthebest.pageplus.dto.Balance; + public abstract class PPInfo { - public static final String[] names = new String[]{"Balance", "Plan", "Minutes", "SMS", "Data"}; - public String[] info; - - public void grabData(String[] userPassPhone) throws Exception { - this.grabData(userPassPhone[0], userPassPhone[1], userPassPhone[2]); + public Balance grabData(String[] userPassPhone) { + return this.grabData(userPassPhone[0], userPassPhone[1], userPassPhone[2]); } - public abstract void grabData(String user, String pass, String phone) throws Exception; + public abstract Balance grabData(String user, String pass, String phone); } diff --git a/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPServer.java b/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPServer.java index 99750d6..c44adc1 100755 --- a/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPServer.java +++ b/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PPServer.java @@ -18,10 +18,13 @@ package org.moparisthebest.pageplus.plugins; +import org.moparisthebest.pageplus.dto.Balance; + import javax.net.ssl.SSLSocketFactory; import java.io.*; import java.net.InetAddress; import java.net.Socket; +import java.util.Date; import java.util.zip.GZIPOutputStream; public class PPServer extends PPInfo { @@ -40,54 +43,62 @@ public class PPServer extends PPInfo { */ public static final boolean useGzip = false; public static final boolean useSSL = false; - // 66.55.93.152 is android.moparisthebest.org, it saves a little data not having to do the DNS lookup - private String address = "66.55.93.152"; - private int port = 1337; + // this is android.moparisthebest.org, it saves a little data not having to do the DNS lookup + public static final String address = "66.55.93.152"; + //public static final String address = "127.0.0.1"; // for testing + public static final int port = 1337; + public static final int sslPort = 1338; @Override - public void grabData(String user, String pass, String phone) throws Exception { + public Balance grabData(String user, String pass, String phone) { //System.setProperty("javax.net.ssl.trustStore", "/home/mopar/workspace/PagePlusClient/pageplus"); //System.setProperty("javax.net.ssl.trustStorePassword", "dvorak"); //System.setProperty("javax.net.debug", "ssl"); - Socket s; - if (useSSL) - s = SSLSocketFactory.getDefault().createSocket(InetAddress.getByName(address), port + 1); - else - s = new Socket(InetAddress.getByName(address), port); + try { + Socket s; + if (useSSL) + s = SSLSocketFactory.getDefault().createSocket(InetAddress.getByName(address), sslPort); + else + s = new Socket(InetAddress.getByName(address), port); + + OutputStream os = s.getOutputStream(); + InputStream is = s.getInputStream(); + if (useGzip) { + os = new java.util.zip.GZIPOutputStream(os); + is = new java.util.zip.GZIPInputStream(is); + } - OutputStream os = s.getOutputStream(); - InputStream is = s.getInputStream(); - if (useGzip) { - os = new java.util.zip.GZIPOutputStream(os); - is = new java.util.zip.GZIPInputStream(is); - } /* DataOutputStream out = new DataOutputStream(os); DataInputStream in = new DataInputStream(is); out.writeUTF(user); out.writeUTF(pass); out.writeUTF(phone); */ - BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); - BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8")); - out.write(user + "\n"); - out.write(pass + "\n"); - out.write(phone + "\n"); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); + out.write(user + "\n"); + out.write(pass + "\n"); + out.write(phone + "\n"); - out.flush(); - if (useGzip) - ((GZIPOutputStream) os).finish(); + out.flush(); + if (useGzip) + ((GZIPOutputStream) os).finish(); - info = new String[5]; - for (int x = 0; x < info.length; ++x) { - info[x] = in.readLine(); - // first line will be 'e' if there is an error, next line is the error message - if (x == 0 && info[x].equals("e")) - throw new Exception(in.readLine()); - //info[x] = in.readUTF(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length = 0; + while ((length = is.read(buffer)) != -1) + baos.write(buffer, 0, length); + Balance ret = new Balance(new String(baos.toByteArray())); + // one little trick, the server doesn't send the date because it might not be the same as OUR date, so if + // error is null, set the date to a current one + if (ret.error == null) + ret.successDate = new Date(); + return ret; + } catch (Throwable e) { + //e.printStackTrace(); + return new Balance().setError(e.getMessage()); } - - s.close(); } } diff --git a/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PagePlusHTTP.java b/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PagePlusHTTP.java index 3c33a8b..475a8f3 100755 --- a/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PagePlusHTTP.java +++ b/plugins/src/main/java/org/moparisthebest/pageplus/plugins/PagePlusHTTP.java @@ -23,6 +23,7 @@ import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import org.moparisthebest.pageplus.dto.Balance; import java.util.HashMap; import java.util.LinkedHashMap; @@ -41,83 +42,87 @@ public class PagePlusHTTP extends PPInfo { // private static final String userAgent = // "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3"; - private static final String userAgent = "Mozilla/5.0 PagePlusAndroidWidget/0.4"; + private static final String userAgent = "Mozilla/5.0 PagePlusAndroidWidget/0.5"; @Override - public void grabData(String user, String pass, String phone) throws Exception { + public Balance grabData(String user, String pass, String phone) { - Connection.Response res = Jsoup.connect("https://www.pagepluscellular.com/login/") - .userAgent(userAgent) - .data("username", user, "password", pass, - "__VIEWSTATE", "/wEPDwUENTM4MQ9kFgJmD2QWAmYPZBYCZg9kFgJmD2QWAgIFEGRkFgoCAw9kFgJmD2QWBAIHDw8WAh4LTmF2aWdhdGVVcmwFBy9sb2dpbi9kZAIJDw8WAh8ABUhodHRwczovL2N1c3RvbWVyLnBhZ2VwbHVzY2VsbHVsYXIuY29tL215LWFjY291bnQvbXktYWNjb3VudC1zdW1tYXJ5LmFzcHhkZAIFDxYCHglpbm5lcmh0bWwF4QE8cD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cDovL3d3dy5mYWNlYm9vay5jb20vcGhvdG8ucGhwP2ZiaWQ9NDg4Mjc4NzY3ODg2ODY4JnNldD1hLjEwNDc5NjUxOTU2ODQzMC4yNzgyLjEwMDMzMTc3NjY4MTU3MSZ0eXBlPTEnPlNvbWV0aW1lcywgYSBzbWFydCBtb3ZlIGlzIGFsbCBpdCB0YWtlcy4gDQoNCkdldCB0aGUgSHVhd2VpIEFzY2VuZCBZIEFuZHJvaWQgc21hLi4uPC9hPjwvcD5kAgYPFgIfAQWuATxwPjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwOi8vdHdpdHRlci5jb20vUGFnZVBsdXMvc3RhdHVzZXMvMzA1MDM1Njg2MzI5ODcyMzg0Jz5QYWdlUGx1czogV2lsbCBJdCBTb29uIGJlIExlZ2FsIHRvIFVubG9jayBZb3VyIENlbGwgUGhvbmU/IGh0dHA6Ly90LmNvL2V0NEJzbDJZQUk8L2E+PC9wPmQCBw8WAh8BBe4LPGg1PjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwOi8vYmxvZy5wYWdlcGx1c2NlbGx1bGFyLmNvbS9zYXZlLW1vbmV5LW9uLXlvdXItY2VsbC1waG9uZS1iaWxsLz91dG1fc291cmNlPXJzcyZ1dG1fbWVkaXVtPXJzcyZ1dG1fY2FtcGFpZ249c2F2ZS1tb25leS1vbi15b3VyLWNlbGwtcGhvbmUtYmlsbCc+U2F2ZSBNb25leSBPbiBZb3VyIENlbGwgUGhvbmUgQmlsbCE8c3Bhbj5ieSBCZW5qYW1pbiBMZXd0b24sIE1hcmtldGluZyBDb29yZGluYXRvcjwvc3Bhbj48L2E+PC9oNT48aDU+PGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHA6Ly9ibG9nLnBhZ2VwbHVzY2VsbHVsYXIuY29tL2JhdHRlcnktc2F2aW5nLXRpcHMtZm9yLXlvdXItYW5kcm9pZC1zbWFydHBob25lLz91dG1fc291cmNlPXJzcyZ1dG1fbWVkaXVtPXJzcyZ1dG1fY2FtcGFpZ249YmF0dGVyeS1zYXZpbmctdGlwcy1mb3IteW91ci1hbmRyb2lkLXNtYXJ0cGhvbmUnPkJhdHRlcnkgU2F2aW5nIFRpcHMgZm9yIFlvdXIgQW5kcm9pZCBTbWFydHBob25lPHNwYW4+YnkgQmVuamFtaW4gTGV3dG9uLCBNYXJrZXRpbmcgQ29vcmRpbmF0b3I8L3NwYW4+PC9hPjwvaDU+PGg1PjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwOi8vYmxvZy5wYWdlcGx1c2NlbGx1bGFyLmNvbS9zd2l0Y2gtdG8tcGFnZS1wbHVzLWFuZC1rZWVwLXlvdXItcGhvbmUtbnVtYmVyLz91dG1fc291cmNlPXJzcyZ1dG1fbWVkaXVtPXJzcyZ1dG1fY2FtcGFpZ249c3dpdGNoLXRvLXBhZ2UtcGx1cy1hbmQta2VlcC15b3VyLXBob25lLW51bWJlcic+U3dpdGNoIHRvIFBhZ2UgUGx1cyBhbmQgS2VlcCBZb3VyIFBob25lIE51bWJlcjxzcGFuPmJ5IEJlbmphbWluIExld3RvbiwgTWFya2V0aW5nIENvb3JkaW5hdG9yPC9zcGFuPjwvYT48L2g1PjxoNT48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cDovL2Jsb2cucGFnZXBsdXNjZWxsdWxhci5jb20vaG93LXRvLWdldC1tb3JlLWRhdGEtb24teW91ci1tb250aGx5LXBsYW4vP3V0bV9zb3VyY2U9cnNzJnV0bV9tZWRpdW09cnNzJnV0bV9jYW1wYWlnbj1ob3ctdG8tZ2V0LW1vcmUtZGF0YS1vbi15b3VyLW1vbnRobHktcGxhbic+SG93IHRvIEdldCBNb3JlIERhdGEgb24gWW91ciBNb250aGx5IFBsYW48c3Bhbj5ieSBCZW5qYW1pbiBMZXd0b24sIE1hcmtldGluZyBDb29yZGluYXRvcjwvc3Bhbj48L2E+PC9oNT48aDU+PGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHA6Ly9ibG9nLnBhZ2VwbHVzY2VsbHVsYXIuY29tLzQtc2ltcGxlLXRpcHMtdG8tcHJvdGVjdC15b3Vyc2VsZi1mcm9tLW1vYmlsZS10aGVmdC8/dXRtX3NvdXJjZT1yc3MmdXRtX21lZGl1bT1yc3MmdXRtX2NhbXBhaWduPTQtc2ltcGxlLXRpcHMtdG8tcHJvdGVjdC15b3Vyc2VsZi1mcm9tLW1vYmlsZS10aGVmdCc+NCBTaW1wbGUgVGlwcyB0byBQcm90ZWN0IFlvdXJzZWxmIEZyb20gTW9iaWxlIFRoZWZ0PHNwYW4+YnkgQmVuamFtaW4gTGV3dG9uLCBNYXJrZXRpbmcgQ29vcmRpbmF0b3I8L3NwYW4+PC9hPjwvaDU+ZAIMDxYCHgdWaXNpYmxlaGQYAQU3Y3RsMDAkY3RsMDAkY3RsMDAkQ29udGVudFBsYWNlSG9sZGVyRGVmYXVsdCRjb250YWN0dmlldw8PZGZkqUZCJgWPdjn7+8v78fspN4En24c=" - ) - .method(Connection.Method.POST).timeout(10 * 1000) - .execute(); + Balance ret = new Balance(); + try { + Connection.Response res = Jsoup.connect("https://www.pagepluscellular.com/login/") + .userAgent(userAgent) + .data("username", user, "password", pass, + "__VIEWSTATE", "/wEPDwUENTM4MQ9kFgJmD2QWAmYPZBYCZg9kFgJmD2QWAgIFEGRkFgoCAw9kFgJmD2QWBAIHDw8WAh4LTmF2aWdhdGVVcmwFBy9sb2dpbi9kZAIJDw8WAh8ABUhodHRwczovL2N1c3RvbWVyLnBhZ2VwbHVzY2VsbHVsYXIuY29tL215LWFjY291bnQvbXktYWNjb3VudC1zdW1tYXJ5LmFzcHhkZAIFDxYCHglpbm5lcmh0bWwF4QE8cD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cDovL3d3dy5mYWNlYm9vay5jb20vcGhvdG8ucGhwP2ZiaWQ9NDg4Mjc4NzY3ODg2ODY4JnNldD1hLjEwNDc5NjUxOTU2ODQzMC4yNzgyLjEwMDMzMTc3NjY4MTU3MSZ0eXBlPTEnPlNvbWV0aW1lcywgYSBzbWFydCBtb3ZlIGlzIGFsbCBpdCB0YWtlcy4gDQoNCkdldCB0aGUgSHVhd2VpIEFzY2VuZCBZIEFuZHJvaWQgc21hLi4uPC9hPjwvcD5kAgYPFgIfAQWuATxwPjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwOi8vdHdpdHRlci5jb20vUGFnZVBsdXMvc3RhdHVzZXMvMzA1MDM1Njg2MzI5ODcyMzg0Jz5QYWdlUGx1czogV2lsbCBJdCBTb29uIGJlIExlZ2FsIHRvIFVubG9jayBZb3VyIENlbGwgUGhvbmU/IGh0dHA6Ly90LmNvL2V0NEJzbDJZQUk8L2E+PC9wPmQCBw8WAh8BBe4LPGg1PjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwOi8vYmxvZy5wYWdlcGx1c2NlbGx1bGFyLmNvbS9zYXZlLW1vbmV5LW9uLXlvdXItY2VsbC1waG9uZS1iaWxsLz91dG1fc291cmNlPXJzcyZ1dG1fbWVkaXVtPXJzcyZ1dG1fY2FtcGFpZ249c2F2ZS1tb25leS1vbi15b3VyLWNlbGwtcGhvbmUtYmlsbCc+U2F2ZSBNb25leSBPbiBZb3VyIENlbGwgUGhvbmUgQmlsbCE8c3Bhbj5ieSBCZW5qYW1pbiBMZXd0b24sIE1hcmtldGluZyBDb29yZGluYXRvcjwvc3Bhbj48L2E+PC9oNT48aDU+PGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHA6Ly9ibG9nLnBhZ2VwbHVzY2VsbHVsYXIuY29tL2JhdHRlcnktc2F2aW5nLXRpcHMtZm9yLXlvdXItYW5kcm9pZC1zbWFydHBob25lLz91dG1fc291cmNlPXJzcyZ1dG1fbWVkaXVtPXJzcyZ1dG1fY2FtcGFpZ249YmF0dGVyeS1zYXZpbmctdGlwcy1mb3IteW91ci1hbmRyb2lkLXNtYXJ0cGhvbmUnPkJhdHRlcnkgU2F2aW5nIFRpcHMgZm9yIFlvdXIgQW5kcm9pZCBTbWFydHBob25lPHNwYW4+YnkgQmVuamFtaW4gTGV3dG9uLCBNYXJrZXRpbmcgQ29vcmRpbmF0b3I8L3NwYW4+PC9hPjwvaDU+PGg1PjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwOi8vYmxvZy5wYWdlcGx1c2NlbGx1bGFyLmNvbS9zd2l0Y2gtdG8tcGFnZS1wbHVzLWFuZC1rZWVwLXlvdXItcGhvbmUtbnVtYmVyLz91dG1fc291cmNlPXJzcyZ1dG1fbWVkaXVtPXJzcyZ1dG1fY2FtcGFpZ249c3dpdGNoLXRvLXBhZ2UtcGx1cy1hbmQta2VlcC15b3VyLXBob25lLW51bWJlcic+U3dpdGNoIHRvIFBhZ2UgUGx1cyBhbmQgS2VlcCBZb3VyIFBob25lIE51bWJlcjxzcGFuPmJ5IEJlbmphbWluIExld3RvbiwgTWFya2V0aW5nIENvb3JkaW5hdG9yPC9zcGFuPjwvYT48L2g1PjxoNT48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cDovL2Jsb2cucGFnZXBsdXNjZWxsdWxhci5jb20vaG93LXRvLWdldC1tb3JlLWRhdGEtb24teW91ci1tb250aGx5LXBsYW4vP3V0bV9zb3VyY2U9cnNzJnV0bV9tZWRpdW09cnNzJnV0bV9jYW1wYWlnbj1ob3ctdG8tZ2V0LW1vcmUtZGF0YS1vbi15b3VyLW1vbnRobHktcGxhbic+SG93IHRvIEdldCBNb3JlIERhdGEgb24gWW91ciBNb250aGx5IFBsYW48c3Bhbj5ieSBCZW5qYW1pbiBMZXd0b24sIE1hcmtldGluZyBDb29yZGluYXRvcjwvc3Bhbj48L2E+PC9oNT48aDU+PGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHA6Ly9ibG9nLnBhZ2VwbHVzY2VsbHVsYXIuY29tLzQtc2ltcGxlLXRpcHMtdG8tcHJvdGVjdC15b3Vyc2VsZi1mcm9tLW1vYmlsZS10aGVmdC8/dXRtX3NvdXJjZT1yc3MmdXRtX21lZGl1bT1yc3MmdXRtX2NhbXBhaWduPTQtc2ltcGxlLXRpcHMtdG8tcHJvdGVjdC15b3Vyc2VsZi1mcm9tLW1vYmlsZS10aGVmdCc+NCBTaW1wbGUgVGlwcyB0byBQcm90ZWN0IFlvdXJzZWxmIEZyb20gTW9iaWxlIFRoZWZ0PHNwYW4+YnkgQmVuamFtaW4gTGV3dG9uLCBNYXJrZXRpbmcgQ29vcmRpbmF0b3I8L3NwYW4+PC9hPjwvaDU+ZAIMDxYCHgdWaXNpYmxlaGQYAQU3Y3RsMDAkY3RsMDAkY3RsMDAkQ29udGVudFBsYWNlSG9sZGVyRGVmYXVsdCRjb250YWN0dmlldw8PZGZkqUZCJgWPdjn7+8v78fspN4En24c=" + ) + .method(Connection.Method.POST).timeout(10 * 1000) + .execute(); - Document doc = res.parse(); + Document doc = res.parse(); /* Connection.Response res = null; Document doc = Jsoup.parse(new java.io.File("balance.html"), "utf-8"); */ - //System.out.println("doc: "+doc.html()); - //if(true) return; - //This will get you cookies - //System.out.println("cookies: "+res.cookies().toString()); + //System.out.println("doc: "+doc.html()); + //if(true) return; + //This will get you cookies + //System.out.println("cookies: "+res.cookies().toString()); - // doesn't support ids with spaces like this, but there is just one select, so just ignore it anyway - //Elements phones = doc.select("select#ContentPlaceHolderDefault_mainContentArea_Item2_My Account Summary_5_Registred1_DrpAccounts").first(); - final Element select = doc.select("select").first(); - if (select == null) - throw new Exception("Your username or password is invalid."); + // doesn't support ids with spaces like this, but there is just one select, so just ignore it anyway + //Elements phones = doc.select("select#ContentPlaceHolderDefault_mainContentArea_Item2_My Account Summary_5_Registred1_DrpAccounts").first(); + final Element select = doc.select("select").first(); + if (select == null) + return ret.setError("Your username or password is invalid."); - final Elements phones = select.select("option"); - final Map phoneToId = new HashMap(phones.size()); - String selectedPhone = null; - for (final Element phoneOption : phones) { - //System.out.println("phoneOption: " + phoneOption.toString()); - final String phoneName = phoneOption.text().toLowerCase(); - phoneToId.put(phoneName, phoneOption.attr("value")); - //System.out.printf("phoneName: '%s' selected: '%s'\n", phoneName, phoneOption.attr("selected")); - if (selectedPhone == null && "selected".equals(phoneOption.attr("selected"))) - selectedPhone = phoneName; - } - System.out.printf("selectedPhone: '%s', registered phones: %s\n", selectedPhone, phoneToId); - - if (!phone.equals(selectedPhone)) { - final String id = phoneToId.get(phone); - if (id != null) { - // we need to request the page with OUR info on it - Map inputs = getFormFields(doc); - inputs.put("ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContentArea$Item2$My Account Summary_5$Registred1$DrpAccounts", id); - System.out.println("inputs: " + inputs); - doc = Jsoup.connect("https://customer.pagepluscellular.com/my-account/my-account-summary.aspx").cookies(res.cookies()) - .data(inputs).method(Connection.Method.POST).timeout(10 * 1000) - .execute().parse(); - } else { - // phone not found, print error messages - throw new Exception("Phone not found! Registered phones: " + phoneToId.keySet()); + final Elements phones = select.select("option"); + final Map phoneToId = new HashMap(phones.size()); + String selectedPhone = null; + for (final Element phoneOption : phones) { + //System.out.println("phoneOption: " + phoneOption.toString()); + final String phoneName = phoneOption.text().toLowerCase(); + phoneToId.put(phoneName, phoneOption.attr("value")); + //System.out.printf("phoneName: '%s' selected: '%s'\n", phoneName, phoneOption.attr("selected")); + if (selectedPhone == null && "selected".equals(phoneOption.attr("selected"))) + selectedPhone = phoneName; } - } + //System.out.printf("selectedPhone: '%s', registered phones: %s\n", selectedPhone, phoneToId); - //System.out.println("doc: " + doc.html()); + if (!phone.equals(selectedPhone) && phoneToId.size() > 1) { + final String id = phoneToId.get(phone); + if (id != null) { + // we need to request the page with OUR info on it + Map inputs = getFormFields(doc); + inputs.put("ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContentArea$Item2$My Account Summary_5$Registred1$DrpAccounts", id); + //System.out.println("inputs: " + inputs); + doc = Jsoup.connect("https://customer.pagepluscellular.com/my-account/my-account-summary.aspx").cookies(res.cookies()) + .data(inputs).method(Connection.Method.POST).timeout(10 * 1000) + .execute().parse(); + } else { + // phone not found, print error messages + return ret.setError("Phone not found! Registered phones: " + phoneToId.keySet()); + } + } - info = new String[names.length]; - int index = -1; - try { - info[++index] = doc.select("span[id=ContentPlaceHolderDefault_mainContentArea_Item2_My Account Summary_5_Registred1_lblBalance]").first().text(); + //System.out.println("doc: " + doc.html()); + int index = -1; + try { + ret.info[++index] = doc.select("span[id=ContentPlaceHolderDefault_mainContentArea_Item2_My Account Summary_5_Registred1_lblBalance]").first().text(); + } catch (Throwable e) { + //e.printStackTrace(); + } + try { + final Element balance = doc.select("div[id=ContentPlaceHolderDefault_mainContentArea_Item2_My Account Summary_5_Registred1_divBundleDetails]").first(); + ret.info[++index] = balance.select("tr.tableHeading").first().text(); + for (Element row : balance.select("tr.odd").first().select("td")) + ret.info[++index] = row.text(); + //System.out.println("balance: " + balance); + } catch (Throwable e) { + //e.printStackTrace(); + } } catch (Throwable e) { - //e.printStackTrace(); - } - try { - final Element balance = doc.select("div[id=ContentPlaceHolderDefault_mainContentArea_Item2_My Account Summary_5_Registred1_divBundleDetails]").first(); - info[++index] = balance.select("tr.tableHeading").first().text(); - for (Element row : balance.select("tr.odd").first().select("td")) - info[++index] = row.text(); - //System.out.println("balance: " + balance); - } catch (Throwable e) { - //e.printStackTrace(); + return ret.setError(e.getMessage()); } + return ret.success(); } public static Map getFormFields(Element form) { diff --git a/server/src/main/java/org/moparisthebest/pageplus/server/Main.java b/server/src/main/java/org/moparisthebest/pageplus/server/Main.java index 82450d3..6eb3f55 100755 --- a/server/src/main/java/org/moparisthebest/pageplus/server/Main.java +++ b/server/src/main/java/org/moparisthebest/pageplus/server/Main.java @@ -18,14 +18,19 @@ package org.moparisthebest.pageplus.server; +import org.moparisthebest.pageplus.dto.Balance; import org.moparisthebest.pageplus.plugins.PPInfo; +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLServerSocketFactory; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.zip.GZIPOutputStream; +import static org.moparisthebest.pageplus.plugins.PPServer.*; + public class Main extends Thread { public static void main(String[] args) { @@ -34,41 +39,48 @@ public class Main extends Thread { // System.setProperty("javax.net.ssl.keyStorePassword", "dvorak"); // System.setProperty("javax.net.debug", "ssl"); - String address = "66.55.93.152"; - int port = 1337; - final ServerSocket sSocket; - //final SSLServerSocket sslSocket; + if (useSSL) + try { + final SSLServerSocket sslSocket = (SSLServerSocket) + SSLServerSocketFactory.getDefault().createServerSocket(sslPort, 0, + InetAddress.getByName(address)); + System.out.println("Listening via SSL on " + address + ":" + sslPort); + // start new thread for SSL accepting + new Thread() { + public void run() { + while (true) + try { + new Main(sslSocket.accept()); + } catch (IOException e) { + // e.printStackTrace(); + } + } + }.start(); + } catch (Exception e) { + System.out.println("Fatal Error listening on SSL:" + e.getMessage()); + return; + } + try { - sSocket = new ServerSocket(port, 0, InetAddress.getByName(address)); + final ServerSocket sSocket = new ServerSocket(port, 0, InetAddress.getByName(address)); System.out.println("Listening on " + address + ":" + port); + // use this thread to accept from regular socket + while (true) + try { + new Main(sSocket.accept()); + } catch (IOException e) { + // e.printStackTrace(); + } } catch (Exception e) { System.out.println("Fatal Error:" + e.getMessage()); return; } - /* - * try { sslSocket = (SSLServerSocket) - * SSLServerSocketFactory.getDefault().createServerSocket(++port, 0, - * InetAddress.getByName(address)); - * System.out.println("Listening via SSL on " + address + ":" + port); } - * catch (Exception e) { System.out.println("Fatal Error:" + - * e.getMessage()); return; } // start SSL accepting thread new - * Thread(){ public void run() { while (true) try { new - * Main(sslSocket.accept()); } catch (IOException e) { // - * e.printStackTrace(); } } }.start(); - */ - // use this thread to accept from regular socket - while (true) - try { - new Main(sSocket.accept()); - } catch (IOException e) { - // e.printStackTrace(); - } } private Socket s; public Main(Socket s) { - System.out.println(s.getInetAddress().getHostName() + " connected to server.\n"); + System.out.println(s.getInetAddress().getHostName() + " connected to server."); this.s = s; this.start(); } @@ -78,7 +90,7 @@ public class Main extends Thread { try { OutputStream os = s.getOutputStream(); InputStream is = s.getInputStream(); - if (org.moparisthebest.pageplus.plugins.PPServer.useGzip) { + if (useGzip) { os = new java.util.zip.GZIPOutputStream(os); is = new java.util.zip.GZIPInputStream(is); } @@ -92,22 +104,24 @@ public class Main extends Thread { userPassPhone[x] = in.readLine(); // userPassPhone[x] = in.readUTF(); // for(String st: userPassPhone) System.out.println("st: "+st); - PPInfo pp = (PPInfo) new org.moparisthebest.pageplus.plugins.PagePlusHTTP(); + PPInfo pp = new org.moparisthebest.pageplus.plugins.PagePlusHTTP(); + Balance balance; try { - pp.grabData(userPassPhone); - } catch (Exception e) { + balance = pp.grabData(userPassPhone); + // never send the date, wastes bandwidth and we discard it at client anyhow + balance.successDate = null; + } catch (Throwable e) { // fudge this to send back exception - pp.info = new String[]{"e", e.getMessage()}; + balance = new Balance().setError(e.getMessage()); + e.printStackTrace(); } - for (String st : pp.info) - out.write(st + "\n"); + out.write(balance.compactFormat()); // out.writeUTF(st); out.flush(); - if (org.moparisthebest.pageplus.plugins.PPServer.useGzip) + if (useGzip) ((GZIPOutputStream) os).finish(); s.close(); } catch (Exception e) { - // TODO Auto-generated catch block e.printStackTrace(); } } diff --git a/server/src/test/java/org/moparisthebest/pageplus/PagePlusClient.java b/server/src/test/java/org/moparisthebest/pageplus/PagePlusClient.java index 321697f..53dc0ac 100755 --- a/server/src/test/java/org/moparisthebest/pageplus/PagePlusClient.java +++ b/server/src/test/java/org/moparisthebest/pageplus/PagePlusClient.java @@ -18,8 +18,11 @@ package org.moparisthebest.pageplus; +import org.moparisthebest.pageplus.dto.Balance; import org.moparisthebest.pageplus.plugins.PPInfo; +import java.util.Arrays; + public class PagePlusClient { public static void main(String[] args) throws Exception { @@ -28,14 +31,18 @@ public class PagePlusClient { return; } PPInfo pp; - pp = new org.moparisthebest.pageplus.plugins.PagePlusHTTP(); - //pp = new org.moparisthebest.pageplus.plugins.PPServer(); + //pp = new org.moparisthebest.pageplus.plugins.PagePlusHTTP(); + pp = new org.moparisthebest.pageplus.plugins.PPServer(); - pp.grabData(args); - - if (pp.info != null) - for (int x = 0; x < PPInfo.names.length; ++x) - System.out.println(PPInfo.names[x] + ": " + pp.info[x]); + Balance b = pp.grabData(args); + System.out.println("original balance:"); + System.out.println(b); + System.out.println("compact balance:"); + String compactBalance = b.compactFormat(); + System.out.println(compactBalance); + System.out.println(Arrays.toString(compactBalance.split("\n"))); + System.out.println("balance from compact balance:"); + System.out.println(new Balance(compactBalance)); } }