1
0
Fork 0
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:
Nikolay Pultsin 2011-09-11 21:40:53 +01:00
parent 6bb1e96ffb
commit 17ea0bee9c
12 changed files with 75 additions and 69 deletions

View file

@ -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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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();
}

View file

@ -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) {

View file

@ -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() {

View file

@ -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();

View file

@ -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();
}
}
}

View file

@ -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);
}

View file

@ -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();
}

View file

@ -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) {