/**
* davfs.js - WebDAV settings and XHTTPRequest object Management API and
* XHTTPRequest High-level WebDAV Client API.
*
* This is a Manager of WebDAV and XHTTPRequest for File system.
* and a High-level WebDAV client API for File system.
* Path base request.
* Resource base request: @see xhrdav.ResourceController
*
* @license Copyright 2011 The xhrdavclient library authors.
* All rights reserved.
*/
goog.provide('xhrdav.DavFs');
goog.provide('xhrdav.DavFs.Request');
goog.require('goog.net.XhrManager');
goog.require('xhrdav.Client');
goog.require('xhrdav.Conf');
goog.require('xhrdav.Errors');
goog.require('xhrdav.ResourceBuilder');
goog.require('xhrdav.ResourceController');
/**
* high-level WebDAV client API Singleton
*
* @constructor
*/
xhrdav.DavFs = function() {
/**
* @private
* @type {goog.net.XhrManager}
*/
this.xhrMgr_ = null;
/**
* @private
* @type {Object.<string,xhrdav.Client>}
*/
this.clients_ = {};
this.initXhrMgr_();
this.addConnection();
};
goog.addSingletonGetter(xhrdav.DavFs);
/** @type {string} */
xhrdav.DavFs.DEFAULT_DAV_SITE_NAME = 'default';
/**
* Init XhrManager with config.
*
* @private
*/
xhrdav.DavFs.prototype.initXhrMgr_ = function() {
var config = xhrdav.Conf.getInstance();
var configXhrMgr = config.getXhrMgrConfig();
if (goog.isDefAndNotNull(configXhrMgr) &&
!goog.object.isEmpty(configXhrMgr)) {
this.xhrMgr_ = new goog.net.XhrManager(
configXhrMgr.maxRetries || 1,
configXhrMgr.headers || {},
configXhrMgr.minCount || 1,
configXhrMgr.maxCount || 10,
configXhrMgr.timeoutInterval || 0);
} else {
this.xhrMgr_ = new goog.net.XhrManager();
}
};
/**
* Get XhrManager of davfs for monitoring, progress, abort, etc.
*
* Example:
* var davFs = xhrdav.DavFs.getInstance();
* var xhrMgr = davFs.getXhrManager();
*
* var onComplete = function(file, e) {
* console.log('Uploaded ' + file.name); };
*
* var delay = new goog.async.ConditionalDelay(function() {
* var sendingCount = xhrMgr.getOutstandingCount();
* console.log('Sending... ' + sendingCount);
* return (sendingCount == 0); });
* delay.onSuccess = function() { alert('Update files on completely!!'); };
* delay.onFailure = function() {
* alert('Failed to upload files by timeout'); };
*
* delay.start(500, 5000);
* goog.array.forEach(files, function(file, i) {
* fs.upload(WEBDAV_ROOT + file.name, file,
* goog.bind(onComplete, this, file), null, null, this);
* }
*
* @return {goog.net.XhrManager} XhrManager object.
*/
xhrdav.DavFs.prototype.getXhrManager = function() {
return this.xhrMgr_;
};
/**
* Setter XhrManager
*
* @param {goog.net.XhrManager} xhrMgr XhrManager object.
* @see goog.net.XhrManager
*/
xhrdav.DavFs.prototype.setXhrManager = function(xhrMgr) {
if (xhrMgr && xhrMgr instanceof goog.net.XhrManager) {
this.xhrMgr_ = xhrMgr;
}
};
/**
* Create WebDAV client object.
*
* @private
* @param {{scheme:string=, domain:stirng=, port:nubmer=}=} opt_uri
* davclient Parameters(opt_uri: scheme, domain, port)
* @param {string} site Settings name of WebDAV site.
*/
xhrdav.DavFs.prototype.createClient_ = function(opt_uri, site) {
var config = xhrdav.Conf.getInstance();
var client = new xhrdav.Client(opt_uri);
client.setXmlParseFunction(goog.getObjectByName(config.xmlParseFuncObj));
goog.object.set(this.clients_, site, client);
};
/**
* Get and Create Connection xhrdav.Client.
*
* @param {string=} opt_davSiteName Any settings name of WebDAV site.
* @return {xhrdav.Client} WebDAV Client connection object.
*/
xhrdav.DavFs.prototype.getConnection = function(opt_davSiteName) {
if (goog.string.isEmptySafe(opt_davSiteName)) {
opt_davSiteName = xhrdav.DavFs.DEFAULT_DAV_SITE_NAME;
}
return this.clients_[opt_davSiteName];
};
/**
* Add WebDAV connection setting(For multiple WebDAV root)
*
* If connection exists, overwrite WebDAV site settings.
*
* @param {{scheme:string=, domain:string=, port:number=}=} opt_uri
* davclient Parameters(opt_uri: scheme, domain, port)
* @param {string=} opt_davSiteName Any settings name of WebDAV site.
*/
xhrdav.DavFs.prototype.addConnection = function(opt_uri, opt_davSiteName) {
if (goog.string.isEmptySafe(opt_davSiteName)) {
opt_davSiteName = xhrdav.DavFs.DEFAULT_DAV_SITE_NAME;
}
this.createClient_(opt_uri, opt_davSiteName);
};
/**
* Get Request object for WebDAV request.
*
* @param {{davSiteName:string=, xhrIo:(goog.net.XhrIo|goog.net.XhrManager)=,
* auth:string=, authOverwrite:boolean=}} options
* davSiteName Any settings name of WebDAV site.
* xhrIo request object of closure library
* (For Cross-site resource sharing[CORS]).
* auth: authorization credentials.
* authOverwrite: overwrite flag for auth credentials.
* @return {xhrdav.DavFs.Request} WebDAV Fs Request object.
* @see xhrdav.DavFs.Request
*/
xhrdav.DavFs.prototype.getRequest = function(options) {
if (!goog.isDefAndNotNull(options)) options = {};
if (goog.string.isEmptySafe(options.davSiteName)) {
options.davSiteName = xhrdav.DavFs.DEFAULT_DAV_SITE_NAME;
}
var davSite = this.getConnection(options.davSiteName);
if (!goog.string.isEmptySafe(options.auth)) {
if (!!options.authOverwrite || !davSite.hasAuthCredentials()) {
davSite.setAuthCredentials(options.auth);
}
}
if (!goog.isDefAndNotNull(options.xhrIo) ||
!(options.xhrIo instanceof goog.net.XhrIo ||
options.xhrIo instanceof goog.net.XhrManager)) {
options.xhrIo = this.xhrMgr_;
}
return new xhrdav.DavFs.Request(davSite, options.xhrIo);
};
/**
* An encapsulation of everything needed to make a DavFs request.
*
*
* @constructor
* @param {xhrdav.Client} davSite WebDAV site.
* @param {(goog.net.XhrIo|goog.net.XhrManager)} xhrIo request object
* of closure library (For Cross-site resource sharing[CORS]).
*/
xhrdav.DavFs.Request = function(davSite, xhrIo) {
/**
* @private
* @type {xhrdav.Client}
*/
this.davSite_ = davSite;
/**
* @private
* @type {(goog.net.XhrIo|goog.net.XhrManager)}
*/
this.xhrIo_ = xhrIo;
};
/**
* WebDAV Response process handler(callback)
*
* @private
* @param {Function} handler callback client.
* @param {Function} processHandler callback process response handler.
* @param {string} path Request path.
* @param {*} context callback function scope.
* @param {number} statusCode HTTP Status code.
* @param {Object} content Response body data.
* @param {Object} headers Response headers.
*/
xhrdav.DavFs.Request.prototype.responseHandler_ = function(
handler, processHandler, path, context, statusCode, content, headers) {
var httpStatus = xhrdav.HttpStatus;
var args = processHandler(path, statusCode, content, headers);
if (goog.isDefAndNotNull(context) && goog.isObject(context)) {
handler.apply(context, args);
} else {
handler(args);
}
};
/**
* Content read Handler
*
* @private
* @param {string} path HTTP Request path.
* @param {number} statusCode HTTP Status code.
* @param {Object} content Response body data.
* @param {Object} headers Response headers.
* @return {Array.<xhrdav.Errors, string=>} Errors, new Location.
* @see xhrdav.Errors
*/
xhrdav.DavFs.Request.prototype.contentReadHandler_ = function(
path, statusCode, content, headers) {
var config = xhrdav.Conf.getInstance();
var httpStatus = xhrdav.HttpStatus;
var errors = new xhrdav.Errors();
var args = [];
if (statusCode != httpStatus.OK) {
var data = {statusCode: statusCode, path: path, content: content};
errors.setRequest(xhrdav.DavFs.Request.buildRequestErrors(data));
}
args.push(errors);
args.push(content);
return args;
};
/**
* Exists Handler
*
* @private
* @param {string} path HTTP Request path.
* @param {number} statusCode HTTP Status code.
* @param {Object} content Response body data.
* @param {Object} headers Response headers.
* @return {Array.<xhrdav.Errors, boolean>} Errors, new Location.
* @see xhrdav.Errors
*/
xhrdav.DavFs.Request.prototype.existsHandler_ = function(
path, statusCode, content, headers) {
var config = xhrdav.Conf.getInstance();
var httpStatus = xhrdav.HttpStatus;
var errors = new xhrdav.Errors();
var args = [];
if (!goog.array.contains(
[httpStatus.OK, httpStatus.CREATED, httpStatus.NO_CONTENT],
statusCode)) {
var data = {statusCode: statusCode, path: path, content: content};
errors.setRequest(xhrdav.DavFs.Request.buildRequestErrors(data));
}
args.push(errors);
args.push(errors.hasRequest() ? false : true);
return args;
};
/**
* Error Handler
*
* Errors object structure:
* {status: <HTTP status code>, path: <request path>,
* summary: <Request error summary message>,
* message: <Request error detail message>}
*
* @private
* @param {string} path HTTP Request path.
* @param {number} statusCode HTTP Status code.
* @param {Object} content Response body data.
* @param {Object} headers Response headers.
* @return {Array.<xhrdav.Errors, string=>} Errors, new Location.
* @see xhrdav.Errors
*/
xhrdav.DavFs.Request.prototype.simpleErrorHandler_ = function(
path, statusCode, content, headers) {
var config = xhrdav.Conf.getInstance();
var httpStatus = xhrdav.HttpStatus;
var errors = new xhrdav.Errors();
var args = [];
if (!goog.array.contains(
[httpStatus.OK, httpStatus.CREATED, httpStatus.NO_CONTENT],
statusCode)) {
var data = {statusCode: statusCode, path: path, content: content};
errors.setRequest(xhrdav.DavFs.Request.buildRequestErrors(data));
}
args.push(errors);
if (statusCode == httpStatus.CREATED) {
args.push(headers['Location']);
}
return args;
};
/**
* Building request errors
*
* @param {{statusCode: number, path: string, content: string=}} data
* Response data.
* @return {{status: number, path: string, html: string,
* summary: string=, message: string=}} errors Map data.
*/
xhrdav.DavFs.Request.buildRequestErrors = function(data) {
var httpStatusText = xhrdav.HttpStatus.text;
var errMap = {};
var errorHtmlDom = !goog.string.isEmptySafe(data.content) ?
goog.dom.htmlToDocumentFragment(data.content) : null;
var summary = null, description = null;
if (goog.isDefAndNotNull(errorHtmlDom)) {
summary = goog.dom.getElementsByTagNameAndClass(
'title', null, errorHtmlDom)[0];
description = goog.dom.getElementsByTagNameAndClass(
'p', null, errorHtmlDom)[0];
}
goog.object.extend(errMap, {
summary: goog.isDefAndNotNull(summary) ?
goog.dom.getTextContent(summary) :
data.statusCode + ' ' + httpStatusText[data.statusCode],
message: goog.isDefAndNotNull(description) ?
goog.dom.getTextContent(description) :
data.statusCode + ' ' + httpStatusText[data.statusCode]
});
goog.object.extend(errMap, {
status: data.statusCode,
path: data.path,
html: data.content});
return errMap;
};
/**
* Build Directory tree from multistatus
*
* @param {Object} content multistatus response data.
* @param {Object=} opt_helper Returning resource controller.
* @return {(xhrdav.Resource|xhrdav.ResourceController|Object)}
* converted object for WebDAV resources.
* @see xhrdav.ResourceBuilder.createCollection
*/
xhrdav.DavFs.Request.prototype.getListDirFromMultistatus = function(
content, opt_helper) {
if (!goog.isDefAndNotNull(opt_helper)) opt_helper = {};
var builder = xhrdav.ResourceBuilder.createCollection(content);
var resources;
if (!!opt_helper.hasCtrl) {
resources = builder.getResources();
if (goog.isDefAndNotNull(resources.root)) resources.root.setRequest(this);
if (!goog.array.isEmpty(resources.childs)) {
goog.array.forEach(resources.childs, function(child) {
child.setRequest(this);
}, this);
}
} else {
resources = builder.serialize(opt_helper.asModel);
}
return resources;
};
/**
* Update(move, copy) request handler.
*
* @private
* @param {string} method Method name of xhrdav.Client instance.
* @param {string} path Update src file path.
* @param {string} dstPath Update destination path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_request Request parameters.
* @param {Object=} context Callback scope.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.updateRequestHandler_ = function(
method, path, dstPath, handler, opt_request, context, onXhrComplete) {
var api = goog.getObjectByName(method, this.davSite_);
api.call(this.davSite_, path, dstPath,
goog.bind(this.responseHandler_, this,
handler, this.simpleErrorHandler_, path, context),
opt_request, onXhrComplete);
};
/**
* Propfind request(listDir, getProps) handler.
*
* @private
* @param {string} method Method name of xhrdav.Client instance.
* @param {string} path propfind request path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_request Request parameters.
* @param {Object=} context Callback scope.
* @param {{hasCtrl:boolean, asModel:boolean}=} opt_helper response options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.propfindRequestHandler_ = function(
path, handler, opt_request, context, opt_helper, onXhrComplete) {
var dataHandler = goog.bind(this.processMultistatus_, this, opt_helper);
this.davSite_.propfind(path,
goog.bind(this.responseHandler_, this, handler, dataHandler, path, context),
opt_request, onXhrComplete);
};
/**
* Processing Reponse Multi-Status Data
*
* @private
* @param {string} path HTTP Request path.
* @param {number} statusCode HTTP Status code.
* @param {Object} content Response body data.
* @param {Object} headers Response headers.
* @return {Array.<xhrdav.Errors, xhrdav.Response>} response contents.
* @see xhrdav.Errors
*/
xhrdav.DavFs.Request.prototype.processMultistatus_ = function(
opt_helper, path, statusCode, content, headers) {
var config = xhrdav.Conf.getInstance();
var httpStatus = xhrdav.HttpStatus;
var errors = new xhrdav.Errors();
var args = [];
if (statusCode == httpStatus.MULTI_STATUS) {
// TODO: research scope
xhrdav.Conf.logging({'name': 'xhrdav.DavFs.Request#processMultistatus_',
'scope': this instanceof xhrdav.DavFs.Request}, 'config');
content = this.getListDirFromMultistatus(content, opt_helper);
} else {
var data = {statusCode: statusCode, path: path, content: content};
errors.setRequest(xhrdav.DavFs.Request.buildRequestErrors(data));
}
args.push(errors);
args.push(content);
return args;
};
/**
* Create Request paramters.
*
* @private
* @param {Object=} opt_headers HTTP Request Headers.
* @param {Object=} opt_params HTTP Query parameters.
* @param {string=} opt_xhrId Xhrmanager Id.
* @return {Object} created request map object.
* @throws {Error} Not found of xhrIo object.
*/
xhrdav.DavFs.Request.prototype.createRequestParameters_ = function(
opt_headers, opt_params, opt_xhrId) {
var opt_request = {headers: opt_headers || {}, query: opt_params || {}};
if (!goog.isDefAndNotNull(this.xhrIo_)) {
// Nothing to do.
} else if (this.xhrIo_ instanceof goog.net.XhrIo) {
goog.object.extend(opt_request, {xhrIo: this.xhrIo_});
} else if (this.xhrIo_ instanceof goog.net.XhrManager) {
var map;
if (!goog.string.isEmptySafe(opt_xhrId)) {
map = {xhrId: opt_xhrId, xhrMgr: this.xhrIo_};
} else {
map = {xhrId: goog.string.createUniqueString(), xhrMgr: this.xhrIo_};
}
goog.object.extend(opt_request, map);
}
return opt_request;
};
/**
* listing collection
*
* @param {string} path Listing request path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{hasCtrl:boolean=, asModel:boolean=, xhrId:string=}=} opt_helper
* xhr and response options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
* @see #propfindRequestHandler_
*/
xhrdav.DavFs.Request.prototype.listDir = function(
path, handler, opt_headers, opt_params, context, opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
opt_request.headers['Depth'] = 1; // listing directory
this.propfindRequestHandler_(path, handler, opt_request,
context, opt_helper, onXhrComplete);
};
/**
* Get property for a single resource.
*
* @param {string} path property get request path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{hasCtrl:boolean=, asModel:boolean=, xhrId:string=}=} opt_helper
* xhr and response options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
* @see #propfindRequestHandler_
*/
xhrdav.DavFs.Request.prototype.getProps = function(
path, handler, opt_headers, opt_params, context, opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
this.propfindRequestHandler_(
path, handler, opt_request, context, onXhrComplete);
};
/**
* Create directory (collection)
*
* @param {string} path Create dierctory path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.mkDir = function(
path, handler, opt_headers, opt_params, context, opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
this.davSite_.mkcol(path,
goog.bind(this.responseHandler_, this,
handler, this.simpleErrorHandler_, path, context),
opt_request, onXhrComplete);
};
/**
* Remove resource
*
* @param {string} path Remove resource path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.remove = function(
path, handler, opt_headers, opt_params, context, opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
this.davSite_._delete(path,
goog.bind(this.responseHandler_, this,
handler, this.simpleErrorHandler_, path, context),
opt_request, onXhrComplete);
};
/**
* Move resource
*
* @param {string} path Move src resource path.
* @param {string} dstPath Move destination path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.move = function(
path, dstPath, handler, opt_headers, opt_params, context,
opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
this.updateRequestHandler_('move',
path, dstPath, handler, opt_request, context, onXhrComplete);
};
/**
* Copy resource
*
* @param {string} path Move src resource path.
* @param {string} dstPath Move destination path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
* @see #updateRequestHandler_
*/
xhrdav.DavFs.Request.prototype.copy = function(
path, dstPath, handler, opt_headers, opt_params, context,
opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
this.updateRequestHandler_('copy',
path, dstPath, handler, opt_request, context, onXhrComplete);
};
/**
* Read data from WebDAV server
*
* @param {string} path read file path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.read = function(
path, handler, opt_headers, opt_params, context, opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
path = xhrdav.utils.path.removeLastSlash(path);
this.davSite_.get(path,
goog.bind(this.responseHandler_, this,
handler, this.contentReadHandler_, path, context),
opt_request, onXhrComplete);
};
/**
* Write data to WebDAV server
*
* @param {string} path upload file path.
* @param {Object} content data string.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.write = function(
path, content, handler, opt_headers, opt_params, context,
opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
path = xhrdav.utils.path.removeLastSlash(path);
this.davSite_.put(path, content,
goog.bind(this.responseHandler_, this,
handler, this.simpleErrorHandler_, path, context),
opt_request, onXhrComplete);
};
/**
* Upload data to WebDAV server
*
* @param {string} path upload file path.
* @param {File} file File object(File API).
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
* @throws {Error} Not a file object.
*/
xhrdav.DavFs.Request.prototype.upload = function(
path, file, handler, opt_headers, opt_params, context,
opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
path = xhrdav.utils.path.removeLastSlash(path);
if (!(file instanceof File)) {
xhrdav.Conf.logging(
{'DavFs.Request#upload':
'Argument "file" is not a file object!![path: ' + path + ']'},
'warning');
xhrdav.Conf.logging(file, 'warning');
}
if (goog.isDefAndNotNull(file)) {
goog.object.extend(opt_request.headers,
{x_file_name: file.name, x_file_size: file.size});
}
this.davSite_.put(path, file,
goog.bind(this.responseHandler_, this,
handler, this.simpleErrorHandler_, path, context),
opt_request, onXhrComplete);
};
/**
* Resource Exists to WebDAV server
*
* @param {string} path exists resource path.
* @param {Function} handler callback handler function.
* @param {Object=} opt_headers Request headers options.
* @param {Object=} opt_params Request query paramters.
* @param {Object=} context Callback scope.
* @param {{xhrId:string=}=} opt_helper xhr options.
* @param {Function=} onXhrComplete onXhrComplete callback function.
*/
xhrdav.DavFs.Request.prototype.exists = function(
path, handler, opt_headers, opt_params, context, opt_helper, onXhrComplete) {
var opt_request = this.createRequestParameters_(
opt_headers, opt_params, opt_helper && opt_helper.xhrId);
this.davSite_.head(path,
goog.bind(this.responseHandler_, this,
handler, this.existsHandler_, path, context),
opt_request, onXhrComplete);
};
/**
* Create ResourceController.
*
* @param {(xhrdav.Resource|Object)=} resource
* Json/Hash object for WebDAV resource.
* @return {xhrdav.ResourceController}
* createed request resource controller object.
* @see xhrdav.ResourceController
*/
xhrdav.DavFs.Request.prototype.createResourceController = function(resource) {
var controller = new xhrdav.ResourceController(resource);
controller.setRequest(this);
return controller;
};
/* Entry Point for closure compiler */
goog.exportSymbol('xhrdav.DavFs.getInstance', xhrdav.DavFs.getInstance);
goog.exportSymbol('xhrdav.DavFs.DEFAULT_DAV_SITE_NAME',
xhrdav.DavFs.DEFAULT_DAV_SITE_NAME);
goog.exportProperty(xhrdav.DavFs.prototype, 'getXhrManager',
xhrdav.DavFs.prototype.getXhrManager);
goog.exportProperty(xhrdav.DavFs.prototype, 'setXhrManager',
xhrdav.DavFs.prototype.setXhrManager);
goog.exportProperty(xhrdav.DavFs.prototype, 'getConnection',
xhrdav.DavFs.prototype.getConnection);
goog.exportProperty(xhrdav.DavFs.prototype, 'addConnection',
xhrdav.DavFs.prototype.addConnection);
goog.exportProperty(xhrdav.DavFs.prototype, 'getRequest',
xhrdav.DavFs.prototype.getRequest);
goog.exportSymbol('xhrdav.DavFs.Request', xhrdav.DavFs.Request);
goog.exportSymbol('xhrdav.DavFs.Request.buildRequestErrors',
xhrdav.DavFs.Request.buildRequestErrors);
goog.exportProperty(xhrdav.DavFs.Request.prototype,
'getListDirFromMultistatus',
xhrdav.DavFs.Request.prototype.getListDirFromMultistatus);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'listDir',
xhrdav.DavFs.Request.prototype.listDir);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'getProps',
xhrdav.DavFs.Request.prototype.getProps);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'mkDir',
xhrdav.DavFs.Request.prototype.mkDir);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'remove',
xhrdav.DavFs.Request.prototype.remove);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'move',
xhrdav.DavFs.Request.prototype.move);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'copy',
xhrdav.DavFs.Request.prototype.copy);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'read',
xhrdav.DavFs.Request.prototype.read);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'write',
xhrdav.DavFs.Request.prototype.write);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'upload',
xhrdav.DavFs.Request.prototype.upload);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'exists',
xhrdav.DavFs.Request.prototype.exists);
goog.exportProperty(xhrdav.DavFs.Request.prototype, 'createResourceController',
xhrdav.DavFs.Request.prototype.createResourceController);