mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-05 19:42:17 +02:00
NetworkOperationData.OnNewItemListener => NetworkItemsLoader
This commit is contained in:
parent
6bb1e96ffb
commit
17ea0bee9c
12 changed files with 75 additions and 69 deletions
|
@ -27,8 +27,9 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException;
|
|||
|
||||
import org.geometerplus.fbreader.network.NetworkOperationData;
|
||||
import org.geometerplus.fbreader.network.NetworkItem;
|
||||
import org.geometerplus.fbreader.network.NetworkItemsLoader;
|
||||
|
||||
public abstract class ItemsLoader implements Runnable, NetworkOperationData.OnNewItemListener {
|
||||
public abstract class ItemsLoader implements NetworkItemsLoader {
|
||||
protected final Activity myActivity;
|
||||
|
||||
private volatile int myItemsCounter = 0;
|
||||
|
@ -158,7 +159,7 @@ public abstract class ItemsLoader implements Runnable, NetworkOperationData.OnNe
|
|||
public abstract void doBefore() throws ZLNetworkException;
|
||||
public abstract void doLoading() throws ZLNetworkException;
|
||||
|
||||
// methods from interface NetworkOperationData.OnNewItemListener
|
||||
// methods from interface NetworkItemsLoader
|
||||
public void onNewItem(final NetworkItem item) {
|
||||
synchronized (myItemsMonitor) {
|
||||
++myItemsCounter;
|
||||
|
|
|
@ -168,7 +168,7 @@ public abstract class AbstractNetworkLink implements INetworkLink, Basket {
|
|||
return sum;
|
||||
}
|
||||
|
||||
public NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener) {
|
||||
public NetworkOperationData createOperationData(NetworkItemsLoader listener) {
|
||||
return new NetworkOperationData(this, listener);
|
||||
}
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ public interface INetworkLink extends Comparable<INetworkLink> {
|
|||
* @param listener Network operation listener
|
||||
* @return instance, which represents the state of the network operation.
|
||||
*/
|
||||
NetworkOperationData createOperationData(NetworkOperationData.OnNewItemListener listener);
|
||||
NetworkOperationData createOperationData(NetworkItemsLoader loader);
|
||||
|
||||
ZLNetworkRequest simpleSearchRequest(String pattern, NetworkOperationData data);
|
||||
ZLNetworkRequest resume(NetworkOperationData data);
|
||||
|
|
|
@ -74,13 +74,13 @@ public abstract class NetworkCatalogItem extends NetworkItem {
|
|||
return Collections.emptyMap();
|
||||
}
|
||||
|
||||
public abstract void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException;
|
||||
public abstract void loadChildren(NetworkItemsLoader loader) throws ZLNetworkException;
|
||||
|
||||
public boolean supportsResumeLoading() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void resumeLoading(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException {
|
||||
public void resumeLoading(NetworkItemsLoader loader) throws ZLNetworkException {
|
||||
throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Geometer Plus <contact@geometerplus.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.geometerplus.fbreader.network;
|
||||
|
||||
public interface NetworkItemsLoader extends Runnable {
|
||||
void onNewItem(NetworkItem item);
|
||||
|
||||
void commitItems();
|
||||
|
||||
/**
|
||||
* @return <code>true</code> to confirm interrupt reading;
|
||||
* <code>false</code> to continue reading.
|
||||
* Once <code>true</code> has been returned,
|
||||
* all next calls MUST return <code>true</code>.
|
||||
*/
|
||||
boolean confirmInterrupt();
|
||||
}
|
|
@ -393,24 +393,12 @@ public class NetworkLibrary {
|
|||
return parentTree != null ? (NetworkTree)parentTree.getSubTree(key.Id) : null;
|
||||
}
|
||||
|
||||
public void simpleSearch(String pattern, final NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException {
|
||||
public void simpleSearch(String pattern, final NetworkItemsLoader loader) throws ZLNetworkException {
|
||||
LinkedList<ZLNetworkRequest> requestList = new LinkedList<ZLNetworkRequest>();
|
||||
LinkedList<NetworkOperationData> dataList = new LinkedList<NetworkOperationData>();
|
||||
|
||||
final NetworkOperationData.OnNewItemListener synchronizedListener = new NetworkOperationData.OnNewItemListener() {
|
||||
public synchronized void onNewItem(NetworkItem item) {
|
||||
listener.onNewItem(item);
|
||||
}
|
||||
public synchronized boolean confirmInterrupt() {
|
||||
return listener.confirmInterrupt();
|
||||
}
|
||||
public synchronized void commitItems() {
|
||||
listener.commitItems();
|
||||
}
|
||||
};
|
||||
|
||||
for (INetworkLink link : activeLinks()) {
|
||||
final NetworkOperationData data = link.createOperationData(synchronizedListener);
|
||||
final NetworkOperationData data = link.createOperationData(loader);
|
||||
final ZLNetworkRequest request = link.simpleSearchRequest(pattern, data);
|
||||
if (request != null) {
|
||||
dataList.add(data);
|
||||
|
@ -423,7 +411,7 @@ public class NetworkLibrary {
|
|||
|
||||
requestList.clear();
|
||||
|
||||
if (listener.confirmInterrupt()) {
|
||||
if (loader.confirmInterrupt()) {
|
||||
return;
|
||||
}
|
||||
for (NetworkOperationData data : dataList) {
|
||||
|
|
|
@ -21,30 +21,14 @@ package org.geometerplus.fbreader.network;
|
|||
|
||||
import org.geometerplus.zlibrary.core.network.ZLNetworkRequest;
|
||||
|
||||
|
||||
public class NetworkOperationData {
|
||||
|
||||
public interface OnNewItemListener {
|
||||
void onNewItem(NetworkItem item);
|
||||
|
||||
void commitItems();
|
||||
|
||||
/**
|
||||
* @return <code>true</code> to confirm interrupt reading;
|
||||
* <code>false</code> to continue reading.
|
||||
* Once <code>true</code> has been returned,
|
||||
* all next calls MUST return <code>true</code>.
|
||||
*/
|
||||
boolean confirmInterrupt();
|
||||
}
|
||||
|
||||
public final INetworkLink Link;
|
||||
public OnNewItemListener Listener;
|
||||
public NetworkItemsLoader Loader;
|
||||
public String ResumeURI;
|
||||
|
||||
public NetworkOperationData(INetworkLink link, OnNewItemListener listener) {
|
||||
public NetworkOperationData(INetworkLink link, NetworkItemsLoader loader) {
|
||||
Link = link;
|
||||
Listener = listener;
|
||||
Loader = loader;
|
||||
}
|
||||
|
||||
protected void clear() {
|
||||
|
|
|
@ -67,7 +67,7 @@ public abstract class NetworkURLCatalogItem extends NetworkCatalogItem {
|
|||
ZLNetworkRequest networkRequest) throws ZLNetworkException {
|
||||
while (networkRequest != null) {
|
||||
ZLNetworkManager.Instance().perform(networkRequest);
|
||||
if (data.Listener.confirmInterrupt()) {
|
||||
if (data.Loader.confirmInterrupt()) {
|
||||
return;
|
||||
}
|
||||
networkRequest = data.resume();
|
||||
|
|
|
@ -57,11 +57,11 @@ abstract class SortedCatalogItem extends NetworkCatalogItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException {
|
||||
public void loadChildren(NetworkItemsLoader loader) throws ZLNetworkException {
|
||||
for (NetworkItem child : myChildren) {
|
||||
listener.onNewItem(child);
|
||||
loader.onNewItem(child);
|
||||
}
|
||||
listener.commitItems();
|
||||
loader.commitItems();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -162,7 +162,7 @@ public class LitResBookshelfItem extends NetworkURLCatalogItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException {
|
||||
public void loadChildren(NetworkItemsLoader loader) throws ZLNetworkException {
|
||||
final LitResAuthenticationManager mgr =
|
||||
(LitResAuthenticationManager)Link.authenticationManager();
|
||||
|
||||
|
@ -183,18 +183,18 @@ public class LitResBookshelfItem extends NetworkURLCatalogItem {
|
|||
if (children.size() <= 5) {
|
||||
Collections.sort(children, new NetworkBookItemComparator());
|
||||
for (NetworkItem item : children) {
|
||||
listener.onNewItem(item);
|
||||
loader.onNewItem(item);
|
||||
}
|
||||
} else {
|
||||
listener.onNewItem(new ByDateCatalogItem(this, children));
|
||||
listener.onNewItem(new ByAuthorCatalogItem(this, children));
|
||||
listener.onNewItem(new ByTitleCatalogItem(this, children));
|
||||
loader.onNewItem(new ByDateCatalogItem(this, children));
|
||||
loader.onNewItem(new ByAuthorCatalogItem(this, children));
|
||||
loader.onNewItem(new ByTitleCatalogItem(this, children));
|
||||
final BySeriesCatalogItem bySeries = new BySeriesCatalogItem(this, children);
|
||||
if (!bySeries.isEmpty()) {
|
||||
listener.onNewItem(bySeries);
|
||||
loader.onNewItem(bySeries);
|
||||
}
|
||||
}
|
||||
listener.commitItems();
|
||||
loader.commitItems();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,8 +32,8 @@ public class OPDSCatalogItem extends NetworkURLCatalogItem {
|
|||
public String LastLoadedId;
|
||||
public final HashSet<String> LoadedIds = new HashSet<String>();
|
||||
|
||||
public State(OPDSNetworkLink link, OnNewItemListener listener) {
|
||||
super(link, listener);
|
||||
public State(OPDSNetworkLink link, NetworkItemsLoader loader) {
|
||||
super(link, loader);
|
||||
}
|
||||
}
|
||||
private State myLoadingState;
|
||||
|
@ -79,15 +79,14 @@ public class OPDSCatalogItem extends NetworkURLCatalogItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public final void loadChildren(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException {
|
||||
OPDSNetworkLink opdsLink = (OPDSNetworkLink) Link;
|
||||
public final void loadChildren(NetworkItemsLoader loader) throws ZLNetworkException {
|
||||
final OPDSNetworkLink opdsLink = (OPDSNetworkLink)Link;
|
||||
|
||||
myLoadingState = opdsLink.createOperationData(listener);
|
||||
myLoadingState = opdsLink.createOperationData(loader);
|
||||
|
||||
ZLNetworkRequest networkRequest =
|
||||
opdsLink.createNetworkData(this, getCatalogUrl(), myLoadingState);
|
||||
|
||||
doLoadChildren(networkRequest);
|
||||
doLoadChildren(
|
||||
opdsLink.createNetworkData(this, getCatalogUrl(), myLoadingState)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -96,9 +95,9 @@ public class OPDSCatalogItem extends NetworkURLCatalogItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public final void resumeLoading(NetworkOperationData.OnNewItemListener listener) throws ZLNetworkException {
|
||||
public final void resumeLoading(NetworkItemsLoader loader) throws ZLNetworkException {
|
||||
if (myLoadingState != null) {
|
||||
myLoadingState.Listener = listener;
|
||||
myLoadingState.Loader = loader;
|
||||
ZLNetworkRequest networkRequest = myLoadingState.resume();
|
||||
doLoadChildren(networkRequest);
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@ class OPDSFeedHandler implements ATOMFeedHandler<OPDSFeedMetadata,OPDSEntry>, OP
|
|||
private boolean tryInterrupt() {
|
||||
final int noninterruptableRemainder = 10;
|
||||
return (myItemsToLoad < 0 || myItemsToLoad > noninterruptableRemainder)
|
||||
&& myData.Listener.confirmInterrupt();
|
||||
&& myData.Loader.confirmInterrupt();
|
||||
}
|
||||
|
||||
private String calculateEntryId(OPDSEntry entry) {
|
||||
|
@ -188,7 +188,7 @@ class OPDSFeedHandler implements ATOMFeedHandler<OPDSFeedMetadata,OPDSEntry>, OP
|
|||
item = readCatalogItem(entry);
|
||||
}
|
||||
if (item != null) {
|
||||
myData.Listener.onNewItem(item);
|
||||
myData.Loader.onNewItem(item);
|
||||
}
|
||||
return tryInterrupt();
|
||||
}
|
||||
|
|
|
@ -75,7 +75,7 @@ public abstract class OPDSNetworkLink extends AbstractNetworkLink {
|
|||
return new ZLNetworkRequest(url) {
|
||||
@Override
|
||||
public void handleStream(InputStream inputStream, int length) throws IOException, ZLNetworkException {
|
||||
if (result.Listener.confirmInterrupt()) {
|
||||
if (result.Loader.confirmInterrupt()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -83,19 +83,19 @@ public abstract class OPDSNetworkLink extends AbstractNetworkLink {
|
|||
new OPDSFeedHandler(catalog, getURL(), result), false
|
||||
).read(inputStream);
|
||||
|
||||
if (result.Listener.confirmInterrupt() && result.LastLoadedId != null) {
|
||||
if (result.Loader.confirmInterrupt() && result.LastLoadedId != null) {
|
||||
// reset state to load current page from the beginning
|
||||
result.LastLoadedId = null;
|
||||
} else {
|
||||
result.Listener.commitItems();
|
||||
result.Loader.commitItems();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public OPDSCatalogItem.State createOperationData(NetworkOperationData.OnNewItemListener listener) {
|
||||
return new OPDSCatalogItem.State(this, listener);
|
||||
public OPDSCatalogItem.State createOperationData(NetworkItemsLoader loader) {
|
||||
return new OPDSCatalogItem.State(this, loader);
|
||||
}
|
||||
|
||||
public ZLNetworkRequest simpleSearchRequest(String pattern, NetworkOperationData data) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue