// Copyright 2008. Studio Melipone. All rights reserved.
// Licence GNU
LGPL
// Send the active document to the UpShot web service
(http://upshotit.com)
// The document is sent as a .png file, as a draft on
the user's account.
// Therefore you must have a document opened and Adobe
Bridge installed to perform this script.
/*
<javascriptresource>
<name>UpShot</name>
<type>automate</type>
<about>
Script for
Upshot
Copyright 2008 Studio Melipone
<http://upshotit.com>
</about>
<enableinfo>true</enableinfo>
</javascriptresource>
*/
//#target photoshop
#include "Base64.jsx"
//
getSource
// In CS2, the function 'toSource()' is broken for functions. The
return
// value includes the text of the function plus whatever else is
left
// in the file.
// This function gets around the problem if you
follow some conventions.
// First, the function definition _must_NOT_ end
with a ';'.
// Second, the next line must contain '// EOF'
// The
result string can then be passed on to Bridge as needed.
// ftn is the
(variable) name of the function
//
function getFunctionSource(ftn) {
if (isCS2()) {
var str = ftn.toSource();
var len = str.indexOf("//
EOF");
return str.substring(0, len) + ')';
}
return
ftn.toSource();
};
function bridgeUpload(file, login, pass, buffer)
{
function _bridgeUpload(file, login, pass, buffer) {
if(!ExternalObject.webaccesslib ) {
ExternalObject.webaccesslib = new
ExternalObject('lib:webaccesslib');
}
var http = new
HttpConnection('http://127.0.0.1:3000/en/users/get_id.xml') ;
http.response = idfile ;
http.username = login;
http.password =
pass;
http.mime='text/xml';
http.responseencoding='utf8';
http.execute();
http.response.close();
http.close();
idfile.open("r");
var str = idfile.read();
idfile.close();
var send = new HttpConnection('http://127.0.0.1:3000/en/users/' +
str + '/upshots') ;
send.method = 'POST';
send.username = login;
send.password = pass;
send.mime='text/xml';
send.requestheaders=['Host','http://localhost:3000'];
send.requestheaders=['Accept','*/*'];
send.requestheaders=['Content-Type','text/xml'];
send.request =
('<upshot><file_name>' + f.name +' </file_name><size>'
+
f.length + '</size><javafile>' + buffer
+
'</javafile></upshot>');
send.execute();
/* ??? What is this for ??? The 'return' was missing ???
*/
return idfile.toSource();
}
// EOF
// The EOF must
occur immediately after the function and the function
// must not be
terminated by a ;
if (BridgeTalk.appName == "bridge") {
_bridgeUpload(file, idfile, login, pass, buffer);
return;
}
var src = _bridgeUpload.toSource();
var brCode = ("function _run(file,
idfile, login password) {\n" +
" var getMetadata = " + src +
";\n\n" +
" return getMetadata(files);\n" +
"};\n" +
"_run(" +
file.toSource() + ',
' +
idfile.toSource() + ', ' +
login.toSource() + ', ' +
pass.toSource() +
");\n");
// create a new BridgeTalk message object
var bt = new
BridgeTalk;
// target the Adobe Bridge application
bt.target =
bridgeTarget;
//p173 of Javascript Tools Guide for CS3 for http
message
bt.body = brCode;
bt.onResult = function(result) {
var object = bt.result = eval(result.body);
//file.remove();
//object.remove();
//bridge.quit ();
//eval(result.body);
};
bt.onError = function( message ) {
var errCode = parseInt
(message.headers ["Error-Code"]);
throw new Error (errCode,
message.body);
} ;
//send the message ( also launch the targetted
application)
// 'send' with a timeout arg only works in CS3
// you
need to use sendSync from XBridgeTalk
bt.send(10);
return
bt.result;
};
//////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/*functions
from <http://www.ps-scripts.com/bb/viewtopic.php?t=1282>
*/
//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
function
getAppSpecifier(appName) {
if (isCS2()) {
if (appName ==
'photoshop') {
return 'photoshop-9.0';
}
if (appName ==
'bridge') {
return 'bridge-1.0';
}
// add other apps
here
}
if (isCS3()) {
if (appName == 'photoshop') {
return 'photoshop-10.0';
}
if (appName == 'bridge') {
return 'bridge-2.0';
}
// add other apps here
}
return undefined;
};
function isCS2() {
var appName =
BridgeTalk.appName;
var version = BridgeTalk.appVersion;
if
(appName == 'photoshop') {
return version.match(/^9\./) != null;
}
if (appName == 'bridge') {
return version.match(/^1\./) !=
null;
}
return false;
};
function isCS3() {
var appName
= BridgeTalk.appName;
var version = BridgeTalk.appVersion;
if
(appName == 'photoshop') {
return version.match(/^10\./) != null;
}
if (appName == 'bridge') {
return version.match(/^2\./) !=
null;
}
return false;
};
function main() {
app.bringToFront();
if (BridgeTalk.appName == "bridge") {
//
this is for testing only
var file = "someFilename";
var idfile =
"somepath/id.xml") ;
var login = "someLogin";
var pass =
"somePass";
var f = new File(filepath);
f.open();
f.encoding = 'BINARY';
var str = f.read();
f.close();
var buffer = base64encode(str);
bridgeUpload(file, idfile, login,
pass, buffer);
return;
}
if (app.documents.length==0) {
// is a document opened ?
alert("There are no Photoshop documents opened
!");
return;
}
/********************************************************/
// Only
Bridge can use HttpConnection, so we test if it is installed
var
bridgeTarget = BridgeTalk.getSpecifier(getAppSpecifier("bridge"));
if( !bridgeTarget ) {
alert("Adobe Bridge not installed, needed to
continue.");
return;
}
app.preferences.rulerUnits =
Units.PIXELS;
app.displayDialogs = DialogModes.NO;
/*********************************************/
/* STEP 1 : save current
document as image file (temporary) */
/******************************************/
var docRef =
activeDocument;
//create the image file in the installation folder of
Photoshop
var filepath=app.path.toString()+"/"+docRef.name+".jpg";
var
file = new File(filepath);
//var options = new
ExportOptionsSaveForWeb();
//options.format = SaveDocumentType.PNG;
var options = new JPEGSaveOptions();
options.quality=8;
docRef.saveAs
(file, options, true, Extension.LOWERCASE);
//docRef.exportDocument (file,
ExportType.SAVEFORWEB , options);
file.close();
/**********************************/
/* STEP 2 : retrieve user's login
& password */
/*******************************/
res =
"dialog { text: 'UpShot authentication', \
info: Panel {
orientation: 'column', alignChildren:'right', \
text: 'Please Identify Yourself', \
login: Group { orientation: 'row', \
s: StaticText { text:'Login :' }, \
e: EditText { characters: 30 } \
}, \
passwd: Group { orientation: 'row', \
s: StaticText { text:'Password :' },
\
e: EditText { characters: 30,
properties:{noecho: true} }, \
}
\
},
\
buttons: Group {
orientation: 'row', \
okBtn:
Button { text:'OK', properties:{name:'ok'} }, \
cancelBtn: Button { text:'Cancel', properties:{name:'cancel'} } \
} \
}";
dlg = new Window (res);
dlg.center();
dlg.show();
var idfile = new File(app.path + "/id.xml") ;
var
login = dlg.info.login.e.text;//retrieve the values given in the form
var
pass = dlg.info.passwd.e.text;
/******************************/
/*
STEP 3 : send image through Bridge */
/***************************/
var f = new File(filepath);
f.open();
f.encoding = 'BINARY';
var buffer = f.read();
f.close();
var b64buffer = base64encode(str);
alert("file size
"+file.length);
alert("f size "+f.length);
alert("BUF "+ buffer);
// I thinks this
// alert(base64encode("B64
"+base64encode(buffer)));
// should be this
alert("B64 "+
b64buffer);
bridgeUpload(file, idfile, login, pass,
b64buffer);
/**********************************************/
/*
STEP 4: Once all done, delete the image previously created */
/*******************************************/
};
main();
//
EOF