From 53c13dc321a918d8dc5683a0bb8cbf75c9fce9fd Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 1 Oct 2011 17:40:06 +0100 Subject: [PATCH] network library code simplification --- .../network/action/NetworkBookActions.java | 31 ++----- .../network/action/SignOutAction.java | 4 +- .../fbreader/network/BasketItem.java | 5 +- .../fbreader/network/INetworkLink.java | 16 ++++ .../fbreader/network/NetworkBookItem.java | 88 ++++++++++++------- .../NetworkAuthenticationManager.java | 13 +-- .../litres/LitResAuthenticationManager.java | 52 ++++------- .../network/opds/OPDSLinkXMLReader.java | 15 +--- .../network/opds/OPDSNetworkLink.java | 14 +++ 9 files changed, 116 insertions(+), 122 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/action/NetworkBookActions.java b/src/org/geometerplus/android/fbreader/network/action/NetworkBookActions.java index d88074015..b11c232e6 100644 --- a/src/org/geometerplus/android/fbreader/network/action/NetworkBookActions.java +++ b/src/org/geometerplus/android/fbreader/network/action/NetworkBookActions.java @@ -55,11 +55,6 @@ public abstract class NetworkBookActions { book.reference(UrlInfo.Type.Book) == null; } - private static boolean useBuyReferences(NetworkBookItem book) { - return book.localCopyFileName() == null && - book.reference(UrlInfo.Type.Book) == null; - } - public static class NBAction extends BookAction { private final int myId; private final String myArg; @@ -107,9 +102,7 @@ public abstract class NetworkBookActions { return R.drawable.ic_list_download; } } - if (useBuyReferences(book) - && book.reference(UrlInfo.Type.BookBuy) != null - || book.reference(UrlInfo.Type.BookBuyInBrowser) != null) { + if (book.getStatus() == NetworkBookItem.Status.CanBePurchased) { return R.drawable.ic_list_buy; } return 0; @@ -140,14 +133,11 @@ public abstract class NetworkBookActions { actions.add(new NBAction(activity, ActionCode.DOWNLOAD_DEMO, "downloadDemo")); } } - if (useBuyReferences(book)) { - int id = ActionCode.TREE_NO_ACTION; + if (book.getStatus() == NetworkBookItem.Status.CanBePurchased) { final BookBuyUrlInfo reference = book.buyInfo(); - if (reference != null) { - id = reference.InfoType == UrlInfo.Type.BookBuy - ? ActionCode.BUY_DIRECTLY : ActionCode.BUY_IN_BROWSER; - actions.add(new NBAction(activity, id, "buy", reference.Price.toString())); - } + final int id = reference.InfoType == UrlInfo.Type.BookBuy + ? ActionCode.BUY_DIRECTLY : ActionCode.BUY_IN_BROWSER; + actions.add(new NBAction(activity, id, "buy", reference.Price.toString())); final BasketItem basketItem = book.Link.getBasketItem(); if (basketItem != null) { if (basketItem.contains(book)) { @@ -201,12 +191,6 @@ public abstract class NetworkBookActions { demo ? UrlInfo.Type.BookDemo : UrlInfo.Type.Book; final BookUrlInfo ref = book.reference(resolvedType); if (ref != null) { - final String sslCertificate; - if (book.Link.authenticationManager() != null) { - sslCertificate = book.Link.authenticationManager().SSLCertificate; - } else { - sslCertificate = null; - } activity.startService( new Intent(Intent.ACTION_VIEW, Uri.parse(ref.Url), activity.getApplicationContext(), BookDownloaderService.class) @@ -214,7 +198,6 @@ public abstract class NetworkBookActions { .putExtra(BookDownloaderService.REFERENCE_TYPE_KEY, resolvedType) .putExtra(BookDownloaderService.CLEAN_URL_KEY, ref.cleanUrl()) .putExtra(BookDownloaderService.TITLE_KEY, book.Title) - .putExtra(BookDownloaderService.SSL_CERTIFICATE_KEY, sslCertificate) ); } } @@ -337,7 +320,7 @@ public abstract class NetworkBookActions { if (which == DialogInterface.BUTTON_NEGATIVE) { return; } - if (!mgr.needPurchase(book)) { + if (book.getStatus() != NetworkBookItem.Status.CanBePurchased) { return; } UIUtil.wait("purchaseBook", buyRunnable, activity); @@ -354,7 +337,7 @@ public abstract class NetworkBookActions { final Runnable buyDialogRunnable = new Runnable() { public void run() { - if (!mgr.needPurchase(book)) { + if (book.getStatus() != NetworkBookItem.Status.CanBePurchased) { final ZLResource boxResource = dialogResource.getResource("alreadyPurchasedBox"); new AlertDialog.Builder(activity) .setTitle(boxResource.getResource("title").getValue()) diff --git a/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java b/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java index 285bb9c24..e35f67804 100644 --- a/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java +++ b/src/org/geometerplus/android/fbreader/network/action/SignOutAction.java @@ -67,7 +67,7 @@ public class SignOutAction extends Action { public String getOptionsLabel(NetworkTree tree) { final NetworkAuthenticationManager mgr = tree.getLink().authenticationManager(); final String userName = - mgr != null && mgr.mayBeAuthorised(false) ? mgr.currentUserName() : ""; + mgr != null && mgr.mayBeAuthorised(false) ? mgr.UserNameOption.getValue() : ""; return super.getOptionsLabel(tree).replace("%s", userName); } @@ -75,7 +75,7 @@ public class SignOutAction extends Action { public String getContextLabel(NetworkTree tree) { final NetworkAuthenticationManager mgr = tree.getLink().authenticationManager(); final String userName = - mgr != null && mgr.mayBeAuthorised(false) ? mgr.currentUserName() : ""; + mgr != null && mgr.mayBeAuthorised(false) ? mgr.UserNameOption.getValue() : ""; return super.getContextLabel(tree).replace("%s", userName); } } diff --git a/src/org/geometerplus/fbreader/network/BasketItem.java b/src/org/geometerplus/fbreader/network/BasketItem.java index e7d1c9679..9b388c4ce 100644 --- a/src/org/geometerplus/fbreader/network/BasketItem.java +++ b/src/org/geometerplus/fbreader/network/BasketItem.java @@ -27,8 +27,6 @@ import org.geometerplus.zlibrary.core.options.ZLStringListOption; import org.geometerplus.fbreader.network.urlInfo.*; import org.geometerplus.fbreader.network.tree.BasketCatalogTree; -import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; - public abstract class BasketItem extends NetworkCatalogItem { private BasketCatalogTree myTree; @@ -147,7 +145,6 @@ public abstract class BasketItem extends NetworkCatalogItem { private Money cost() { Money sum = Money.ZERO; - final NetworkAuthenticationManager mgr = Link.authenticationManager(); synchronized (myBooks) { for (String id : bookIds()) { final NetworkBookItem b = myBooks.get(id); @@ -158,7 +155,7 @@ public abstract class BasketItem extends NetworkCatalogItem { if (info == null) { return null; } - if (mgr == null || mgr.needPurchase(b)) { + if (b.getStatus() == NetworkBookItem.Status.CanBePurchased) { sum = sum.add(info.Price); } } diff --git a/src/org/geometerplus/fbreader/network/INetworkLink.java b/src/org/geometerplus/fbreader/network/INetworkLink.java index d78551db0..f6f22c381 100644 --- a/src/org/geometerplus/fbreader/network/INetworkLink.java +++ b/src/org/geometerplus/fbreader/network/INetworkLink.java @@ -29,6 +29,14 @@ import org.geometerplus.fbreader.network.urlInfo.UrlInfoWithDate; import org.geometerplus.fbreader.network.tree.NetworkItemsLoader; public interface INetworkLink extends Comparable { + public enum AccountStatus { + NotSupported, + NoUserName, + SignedIn, + SignedOut, + NotChecked + }; + public static final int INVALID_ID = -1; int getId(); @@ -42,6 +50,14 @@ public interface INetworkLink extends Comparable { UrlInfoWithDate getUrlInfo(UrlInfo.Type type); Set getUrlKeys(); + /** + * @param force if local status is not checked then + * if force is set to false, NotChecked will be returned + * if force is set to true, network check will be performed; + * that will take some time and can return NotChecked (if network is not available) + */ + //AccountStatus getAccountStatus(boolean force); + /** * @return 2-letters language code or special token "multi" */ diff --git a/src/org/geometerplus/fbreader/network/NetworkBookItem.java b/src/org/geometerplus/fbreader/network/NetworkBookItem.java index 1eeea596d..975c2e881 100644 --- a/src/org/geometerplus/fbreader/network/NetworkBookItem.java +++ b/src/org/geometerplus/fbreader/network/NetworkBookItem.java @@ -28,6 +28,13 @@ import org.geometerplus.fbreader.network.urlInfo.*; import org.geometerplus.fbreader.network.authentication.NetworkAuthenticationManager; public class NetworkBookItem extends NetworkItem { + public static enum Status { + NotAvailable, + Downloaded, + ReadyForDownload, + CanBePurchased + }; + public static class AuthorData implements Comparable { public final String DisplayName; public final String SortKey; @@ -120,7 +127,24 @@ public class NetworkBookItem extends NetworkItem { return null; } - public BookUrlInfo reference(UrlInfo.Type type) { + public Status getStatus() { + if (localCopyFileName() != null) { + return Status.Downloaded; + } else if (reference(UrlInfo.Type.Book) != null) { + return Status.ReadyForDownload; + } else if (buyInfo() != null) { + return Status.CanBePurchased; + } else { + return Status.NotAvailable; + } + } + + /* + public Status getDemoStatus() { + } + */ + + private BookUrlInfo getReferenceInternal(UrlInfo.Type type) { BookUrlInfo reference = null; for (UrlInfo r : getAllInfos(type)) { if (!(r instanceof BookUrlInfo)) { @@ -131,35 +155,37 @@ public class NetworkBookItem extends NetworkItem { reference = br; } } - - if (reference == null && type == UrlInfo.Type.Book) { - reference = this.reference(UrlInfo.Type.BookConditional); - if (reference != null) { - NetworkAuthenticationManager authManager = Link.authenticationManager(); - if (authManager == null || authManager.needPurchase(this)) { - return null; - } - reference = authManager.downloadReference(this); - } - } - - if (reference == null && - type == UrlInfo.Type.Book && - this.reference(UrlInfo.Type.BookBuy) == null && - this.reference(UrlInfo.Type.BookBuyInBrowser) == null) { - reference = this.reference(UrlInfo.Type.BookFullOrDemo); - } - - if (reference == null && - type == UrlInfo.Type.BookDemo && - (this.reference(UrlInfo.Type.BookBuy) != null || - this.reference(UrlInfo.Type.BookBuyInBrowser) != null)) { - reference = this.reference(UrlInfo.Type.BookFullOrDemo); - } - return reference; } + public BookUrlInfo reference(UrlInfo.Type type) { + final BookUrlInfo reference = getReferenceInternal(type); + if (reference != null) { + return reference; + } + + switch (type) { + case Book: + if (getReferenceInternal(UrlInfo.Type.BookConditional) != null) { + final NetworkAuthenticationManager authManager = Link.authenticationManager(); + if (authManager == null || authManager.needPurchase(this)) { + return null; + } + return authManager.downloadReference(this); + } else if (buyInfo() == null) { + return getReferenceInternal(UrlInfo.Type.BookFullOrDemo); + } + break; + case BookDemo: + if (buyInfo() != null) { + return getReferenceInternal(UrlInfo.Type.BookFullOrDemo); + } + break; + } + + return null; + } + public BookBuyUrlInfo buyInfo() { final UrlInfo info = reference(UrlInfo.Type.BookBuy); if (info != null) { @@ -169,9 +195,7 @@ public class NetworkBookItem extends NetworkItem { } public String localCopyFileName() { - final boolean hasBuyReference = - this.reference(UrlInfo.Type.BookBuy) != null || - this.reference(UrlInfo.Type.BookBuyInBrowser) != null; + final boolean hasBuyReference = buyInfo() != null; BookUrlInfo reference = null; String fileName = null; for (UrlInfo r : getAllInfos()) { @@ -195,9 +219,7 @@ public class NetworkBookItem extends NetworkItem { } public void removeLocalFiles() { - final boolean hasBuyReference = - this.reference(UrlInfo.Type.BookBuy) != null || - this.reference(UrlInfo.Type.BookBuyInBrowser) != null; + final boolean hasBuyReference = buyInfo() != null; for (UrlInfo r : getAllInfos()) { if (!(r instanceof BookUrlInfo)) { continue; diff --git a/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java index b19ae4b86..7506470ae 100644 --- a/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java @@ -33,7 +33,7 @@ import org.geometerplus.fbreader.network.urlInfo.BookUrlInfo; public abstract class NetworkAuthenticationManager { private static final HashMap ourManagers = new HashMap(); - public static NetworkAuthenticationManager createManager(INetworkLink link, String sslCertificate, Class managerClass) { + public static NetworkAuthenticationManager createManager(INetworkLink link, Class managerClass) { NetworkAuthenticationManager mgr = ourManagers.get(link.getSiteName()); if (mgr == null) { if (managerClass == LitResAuthenticationManager.class) { @@ -49,12 +49,10 @@ public abstract class NetworkAuthenticationManager { public final INetworkLink Link; public final ZLStringOption UserNameOption; - public final String SSLCertificate; - protected NetworkAuthenticationManager(INetworkLink link, String sslCertificate) { + protected NetworkAuthenticationManager(INetworkLink link) { Link = link; UserNameOption = new ZLStringOption(link.getSiteName(), "userName", ""); - SSLCertificate = sslCertificate; } /* @@ -73,11 +71,6 @@ public abstract class NetworkAuthenticationManager { return true; } - /* - * Account specific methods (can be called only if authorised!!!) - */ - public abstract String currentUserName(); - public boolean needsInitialization() { return false; } @@ -103,8 +96,6 @@ public abstract class NetworkAuthenticationManager { return null; } - //public abstract ZLNetworkSSLCertificate certificate(); - /* * topup account */ diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java index dd46fced1..cb03c7c39 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java @@ -49,7 +49,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { new LinkedList(); public LitResAuthenticationManager(OPDSNetworkLink link) { - super(link, null); + super(link); mySidOption = new ZLStringOption(link.getSiteName(), "sid", ""); myUserIdOption = new ZLStringOption(link.getSiteName(), "userId", ""); @@ -99,36 +99,27 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { sid = mySidOption.getValue(); } - final Map params = new HashMap(); - final String url = parseUrl(Link.getUrl(UrlInfo.Type.SignIn), params); - if (url == null) { - throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); - } - - final LitResLoginXMLReader xmlReader = new LitResLoginXMLReader(Link.getSiteName()); - - ZLNetworkException exception = null; try { + final LitResLoginXMLReader xmlReader = new LitResLoginXMLReader(Link.getSiteName()); + final Map params = new HashMap(); + final String url = parseUrl(Link.getUrl(UrlInfo.Type.SignIn), params); + if (url == null) { + throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); + } final LitResNetworkRequest request = new LitResNetworkRequest(url, xmlReader); for (Map.Entry entry : params.entrySet()) { request.addPostParameter(entry.getKey(), entry.getValue()); } request.addPostParameter("sid", sid); ZLNetworkManager.Instance().perform(request); - } catch (ZLNetworkException e) { - exception = e; - } - - synchronized (this) { - if (exception != null) { - if (NetworkException.ERROR_AUTHENTICATION_FAILED.equals(exception.getCode())) { - throw exception; - } - logOut(false); - return false; - } initUser(UserNameOption.getValue(), xmlReader.Sid, xmlReader.UserId, xmlReader.CanRebill); return true; + } catch (ZLNetworkException e) { + if (NetworkException.ERROR_AUTHENTICATION_FAILED.equals(e.getCode())) { + throw e; + } + logOut(false); + return false; } } @@ -185,20 +176,6 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { return new DecoratedBookUrlInfo(reference, url); } - - @Override - public String currentUserName() { - final String value; - synchronized (this) { - value = UserNameOption.getValue(); - } - if (value.length() == 0) { - return null; - } - return value; - } - - @Override public synchronized boolean needPurchase(NetworkBookItem book) { return !myPurchasedBookMap.containsKey(book.Id); @@ -446,6 +423,9 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } private static String parseUrl(String url, Map params) { + if (url == null) { + return null; + } final String[] parts = url.split("\\?"); if (parts.length != 2) { return url; diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java index 180847dcb..864864433 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java @@ -121,16 +121,8 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants { } } - final String sslCertificate; - final String path = "network/" + siteName + ".crt"; - if (ZLResourceFile.createResourceFile(path).exists()) { - sslCertificate = path; - } else { - sslCertificate = null; - } - if (siteName != null && title != null && infos.getInfo(UrlInfo.Type.Catalog) != null) { - myLinks.add(link(id, siteName, title, summary, language, infos, sslCertificate)); + myLinks.add(link(id, siteName, title, summary, language, infos)); } return false; } @@ -141,8 +133,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants { CharSequence title, CharSequence summary, String language, - UrlInfoCollection infos, - String sslCertificate + UrlInfoCollection infos ) { final String titleString = title.toString(); final String summaryString = summary != null ? summary.toString() : null; @@ -164,7 +155,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants { if (myAuthenticationType == "litres") { opdsLink.setAuthenticationManager( NetworkAuthenticationManager.createManager( - opdsLink, sslCertificate, LitResAuthenticationManager.class + opdsLink, LitResAuthenticationManager.class ) ); } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java index df6310593..6b71fd7c4 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java @@ -69,6 +69,20 @@ public abstract class OPDSNetworkLink extends AbstractNetworkLink { myAuthenticationManager = mgr; } + /* + public AccountStatus getAccountStatus(boolean force) { + if (myAuthenticationManager == null) { + return AccountStatus.NotSupported; + } + if ("".equals(myAuthenticationManager.UserNameOption.getValue())) { + return AccountStatus.NoUserName; + } + } + SignedIn, + SignedOut, + NotChecked + */ + ZLNetworkRequest createNetworkData(final OPDSCatalogItem catalog, String url, final OPDSCatalogItem.State result) { if (url == null) { return null;