/** * Write a key using the current settings. * @throws IOException * @throws MalformedURLException If an error in the key itself prevented it from being written. */ private void writeKey(DataOutputStream dos, FreenetURI freenetURI) throws IOException { if(fullKeys) { freenetURI.writeFullBinaryKeyWithLength(dos); } else { String[] meta = freenetURI.getAllMetaStrings(); if((meta != null) && (meta.length > 0)) throw new MalformedURLException("Not a plain CHK"); BaseClientKey key = BaseClientKey.getBaseKey(freenetURI); if(key instanceof ClientCHK) { ((ClientCHK)key).writeRawBinaryKey(dos); } else throw new IllegalArgumentException("Full keys must be enabled to write non-CHKs"); } }
@Override public void onEncode(BaseClientKey key, ClientPutState state, ClientContext context) { if (logMINOR) Logger.minor(this, "onEncode(" + key.getURI().toString(false, false) + ") for " + this); if (rootMetaPutHandler == this) { finalURI = key.getURI(); cb.onGeneratedURI(finalURI, this); return; } metadata.resolve(key.getURI()); }
@Override public void onEncode(BaseClientKey key, ClientPutState state, ClientContext context) { if (logMINOR) Logger.minor(this, "onEncode(" + key.getURI().toString(false, false) + ") for " + this); if (rootContainerPutHandler == this) { finalURI = key.getURI(); cb.onGeneratedURI(finalURI, this); } else { synchronized (BaseManifestPutter.this) { HashMap<String, Object> hm = putHandlersTransformMap.get(this); perContainerPutHandlersWaitingForMetadata.get(parentPutHandler).remove(this); Metadata m = new Metadata(DocumentType.SIMPLE_REDIRECT, null, null, key.getURI(), cm); hm.put(this.itemName, m); putHandlersTransformMap.remove(this); try { tryStartParentContainer(parentPutHandler, context); } catch (InsertException e) { fail(e, context); return; } } } }
/** * Create a fetcher for a key. */ public static ClientGetState create(ClientRequester requester, GetCompletionCallback cb, FreenetURI uri, FetchContext ctx, ArchiveContext actx, int maxRetries, int recursionLevel, boolean dontTellClientGet, long l, boolean isEssential, boolean isFinal, ClientContext context, boolean realTimeFlag, boolean hasInitialMetadata) throws MalformedURLException, FetchException { BaseClientKey key = null; if(!hasInitialMetadata) key = BaseClientKey.getBaseKey(uri); if((!uri.hasMetaStrings()) && ctx.allowSplitfiles == false && ctx.followRedirects == false && key instanceof ClientKey && (!hasInitialMetadata)) return new SimpleSingleFileFetcher((ClientKey)key, maxRetries, ctx, requester, cb, isEssential, false, l, context, false, realTimeFlag); if(key instanceof ClientKey || hasInitialMetadata) return new SingleFileFetcher(requester, cb, null, (ClientKey)key, new ArrayList<String>(uri.listMetaStrings()), uri, 0, ctx, false, realTimeFlag, actx, null, null, maxRetries, recursionLevel, dontTellClientGet, l, isEssential, isFinal, false, (short)0, context, hasInitialMetadata); else { return uskCreate(requester, realTimeFlag, cb, (USK)key, new ArrayList<String>(uri.listMetaStrings()), ctx, actx, maxRetries, recursionLevel, dontTellClientGet, l, isEssential, isFinal, context); } }
@Override public void onEncode(BaseClientKey key, ClientPutState state, ClientContext context) { if (logMINOR) Logger.minor(this, "onEncode(" + key.getURI().toString(false, false) + ") for " + this); synchronized (BaseManifestPutter.this) { // transform the placeholders to redirects (redirects to 'uri/name') and // remove from waitfor lists ArrayList<PutHandler> phv = putHandlersArchiveTransformMap.get(this); if(phv == null) return; // Already encoded. for (PutHandler ph : phv) { HashMap<String, Object> hm = putHandlersTransformMap.get(ph); perContainerPutHandlersWaitingForMetadata.get(ph.parentPutHandler).remove(ph); if (ph.targetInArchive == null) throw new NullPointerException(); Metadata m = new Metadata(DocumentType.SIMPLE_REDIRECT, null, null, key.getURI().setMetaString(new String[] { ph.targetInArchive }), cm); hm.put(ph.itemName, m); putHandlersTransformMap.remove(ph); try { tryStartParentContainer(ph.parentPutHandler, context); } catch (InsertException e) { fail(new InsertException(InsertExceptionMode.INTERNAL_ERROR, e, null), context); return; } } putHandlersArchiveTransformMap.remove(this); } }
ClientKey redirectedKey; try { BaseClientKey k = BaseClientKey.getBaseKey(newURI); if(k instanceof ClientKey) redirectedKey = (ClientKey) k;
@Override public void onEncode(BaseClientKey key, ClientPutState state, ClientContext context) { if (logMINOR) Logger.minor(this, "onEncode(" + key + ") for " + this); //debugDecompose("ExternPutHandler.onEncode Begin"); if(metadata != null) { Logger.error(this, "Reassigning metadata: "+metadata, new Exception("debug")); //throw new IllegalStateException("Metadata set but we got a uri?!"); } // The file was too small to have its own metadata, we get this instead. // So we make the key into metadata. Metadata m = new Metadata(DocumentType.SIMPLE_REDIRECT, null, null, key.getURI(), cm); onMetadata(m, state, context); //debugDecompose("ExternPutHandler.onEncode End"); }
/** Called when we know the final URI of the insert. */ @Override public void onEncode(BaseClientKey key, ClientPutState state, ClientContext context) { FreenetURI u; synchronized(this) { u = key.getURI(); if(gotFinalMetadata) { Logger.error(this, "Generated URI *and* sent final metadata??? on "+this+" from "+state); } if(targetFilename != null) u = u.pushMetaString(targetFilename); if(this.uri != null) { if(!this.uri.equals(u)) { Logger.error(this, "onEncode() called twice with different URIs: "+this.uri+" -> "+u+" for "+this, new Exception("error")); } return; } this.uri = u; } client.onGeneratedURI(u, this); }