LT-239: Handle the error if the last imported file is not dcm file
- Add message label in progress dialog
This commit is contained in:
1 parent
2a17760ff8
commit
dfcb33153f
8 files changed
+246
-170
No files matched your search
@@ -1,9 +1,9 @@
|
||||
var net = Npm.require('net'),
|
||||
var net = Npm.require('net'),
|
||||
Socket = net.Socket;
|
||||
|
||||
var DEFAULT_MAX_PACKAGE_SIZE = 32768;
|
||||
|
||||
Connection = function(options) {
|
||||
Connection = function (options) {
|
||||
EventEmitter.call(this);
|
||||
this.options = Object.assign({
|
||||
maxPackageSize: C.DEFAULT_MAX_PACKAGE_SIZE,
|
||||
@@ -22,142 +22,152 @@ Connection = function(options) {
|
||||
|
||||
util.inherits(Connection, EventEmitter);
|
||||
|
||||
var StoreHandle = function() {
|
||||
var StoreHandle = function () {
|
||||
EventEmitter.call(this);
|
||||
}
|
||||
util.inherits(StoreHandle, EventEmitter);
|
||||
|
||||
Connection.prototype.addPeer = function(options) {
|
||||
if (!options.aeTitle || !options.host || !options.port) {
|
||||
return false;
|
||||
}
|
||||
this.peers[options.aeTitle] = {
|
||||
host : options.host, port : options.port
|
||||
};
|
||||
if (options.default) {
|
||||
if (options.server) {
|
||||
this.defaultServer = options.aeTitle;
|
||||
} else {
|
||||
this.defaultPeer = options.aeTitle;
|
||||
Connection.prototype.addPeer = function (options) {
|
||||
if (!options.aeTitle || !options.host || !options.port) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (options.server) {
|
||||
//start listening
|
||||
var server = net.createServer();
|
||||
server.listen(options.port, options.host, function(){
|
||||
console.log("listening on %j", this.address());
|
||||
});
|
||||
server.on('error', function(err){
|
||||
console.log("server error %j", err);
|
||||
});
|
||||
var o = this;
|
||||
server.on('connection', function(nativeSocket) {
|
||||
//incoming connections
|
||||
var socket = new CSocket(nativeSocket, o.options);
|
||||
o.addSocket(options.aeTitle, socket);
|
||||
|
||||
//close server on close socket
|
||||
socket.on('close', function(){
|
||||
server.close();
|
||||
this.peers[options.aeTitle] = {
|
||||
host: options.host, port: options.port
|
||||
};
|
||||
if (options.default) {
|
||||
if (options.server) {
|
||||
this.defaultServer = options.aeTitle;
|
||||
} else {
|
||||
this.defaultPeer = options.aeTitle;
|
||||
}
|
||||
}
|
||||
if (options.server) {
|
||||
//start listening
|
||||
var server = net.createServer();
|
||||
server.listen(options.port, options.host, function () {
|
||||
console.log("listening on %j", this.address());
|
||||
});
|
||||
});
|
||||
}
|
||||
server.on('error', function (err) {
|
||||
console.log("server error %j", err);
|
||||
});
|
||||
var o = this;
|
||||
server.on('connection', function (nativeSocket) {
|
||||
//incoming connections
|
||||
var socket = new CSocket(nativeSocket, o.options);
|
||||
o.addSocket(options.aeTitle, socket);
|
||||
|
||||
//close server on close socket
|
||||
socket.on('close', function () {
|
||||
server.close();
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
Connection.prototype.selectPeer = function(aeTitle) {
|
||||
Connection.prototype.selectPeer = function (aeTitle) {
|
||||
if (!aeTitle || !this.peers[aeTitle]) {
|
||||
throw "No such peer";
|
||||
throw "No such peer";
|
||||
}
|
||||
return this.peers[aeTitle];
|
||||
}
|
||||
|
||||
Connection.prototype._sendFile = function(socket, sHandle, file, maxSend, metaLength, list) {
|
||||
var fileNameText = typeof file.file == 'string' ? file.file : 'buffer';
|
||||
console.log("Sending file " + fileNameText);
|
||||
var useContext = socket.getContextByUID(file.context), self = this;
|
||||
|
||||
PDU.generatePDatas(useContext.id, file.file, maxSend, null, metaLength, function(err, handle) {
|
||||
if (err) {
|
||||
console.log('Error while sending file');
|
||||
return;
|
||||
}
|
||||
var processNext = function() {
|
||||
var next = list.shift();
|
||||
if (next)
|
||||
self._sendFile(socket, sHandle, next, maxSend, metaLength, list);
|
||||
else
|
||||
socket.release();
|
||||
};
|
||||
|
||||
var store = socket.storeInstance(useContext.abstractSyntax, file.uid);
|
||||
handle.on('pdv', function(pdv) {
|
||||
socket.sendPData(pdv);
|
||||
});
|
||||
handle.on('error', function(err) {
|
||||
sHandle.emit('file', err, fileNameText);
|
||||
processNext();
|
||||
});
|
||||
store.on('response', function(msg) {
|
||||
var statusText = msg.getStatus().toString(16);
|
||||
console.log('STORE reponse with status', statusText);
|
||||
var error = null;
|
||||
if (msg.failure()) {
|
||||
error = new Error(statusText);
|
||||
}
|
||||
sHandle.emit('file', error, fileNameText);
|
||||
processNext();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
Connection.prototype.storeInstances = function(fileList) {
|
||||
var contexts = {}, read = 0, length = fileList.length, toSend = [], self = this, handle = new StoreHandle();
|
||||
fileList.forEach(function(bufferOrFile){
|
||||
var fileNameText = typeof bufferOrFile == 'string' ? bufferOrFile : 'buffer';
|
||||
DicomMessage.readMetaHeader(bufferOrFile, function(err, metaMessage, metaLength) {
|
||||
read++;
|
||||
Connection.prototype._sendFile = function (socket, sHandle, file, maxSend, metaLength, list) {
|
||||
var fileNameText = typeof file.file == 'string' ? file.file : 'buffer';
|
||||
console.log("Sending file " + fileNameText);
|
||||
var useContext = socket.getContextByUID(file.context), self = this;
|
||||
|
||||
PDU.generatePDatas(useContext.id, file.file, maxSend, null, metaLength, function (err, handle) {
|
||||
if (err) {
|
||||
handle.emit('file', err, fileNameText);
|
||||
return;
|
||||
console.log('Error while sending file');
|
||||
return;
|
||||
}
|
||||
console.log('Dicom file ' + (typeof bufferOrFile == 'string' ? bufferOrFile : 'buffer') + ' found');
|
||||
var syntax = metaMessage.getValue(0x00020010),
|
||||
sopClassUID = metaMessage.getValue(0x00020002),
|
||||
instanceUID = metaMessage.getValue(0x00020003);
|
||||
var processNext = function () {
|
||||
var next = list.shift();
|
||||
if (next)
|
||||
self._sendFile(socket, sHandle, next, maxSend, metaLength, list);
|
||||
else
|
||||
socket.release();
|
||||
};
|
||||
|
||||
if (!contexts[sopClassUID]) {
|
||||
contexts[sopClassUID] = [];
|
||||
}
|
||||
if (syntax && contexts[sopClassUID].indexOf(syntax) == -1) {
|
||||
contexts[sopClassUID].push(syntax);
|
||||
}
|
||||
toSend.push({file : bufferOrFile, context : sopClassUID, uid : instanceUID});
|
||||
|
||||
if (read == length) {
|
||||
var useContexts = [];
|
||||
for (var context in contexts) {
|
||||
var useSyntaxes = contexts[context];
|
||||
if (useSyntaxes.length > 0) {
|
||||
useContexts.push({context : context, syntaxes : contexts[context]});
|
||||
} else {
|
||||
throw "No syntax specified for context " + context;
|
||||
var store = socket.storeInstance(useContext.abstractSyntax, file.uid);
|
||||
handle.on('pdv', function (pdv) {
|
||||
socket.sendPData(pdv);
|
||||
});
|
||||
handle.on('error', function (err) {
|
||||
sHandle.emit('file', err, fileNameText);
|
||||
processNext();
|
||||
});
|
||||
store.on('response', function (msg) {
|
||||
var statusText = msg.getStatus().toString(16);
|
||||
console.log('STORE reponse with status', statusText);
|
||||
var error = null;
|
||||
if (msg.failure()) {
|
||||
error = new Error(statusText);
|
||||
}
|
||||
}
|
||||
sHandle.emit('file', error, fileNameText);
|
||||
processNext();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
self.associate({
|
||||
contexts : useContexts
|
||||
}, function(ac) {
|
||||
var maxSend = ac.getMaxSize(), next = toSend.shift();
|
||||
self._sendFile(this, handle, next, maxSend, metaLength, toSend);
|
||||
Connection.prototype.storeInstances = function (fileList) {
|
||||
var contexts = {}, read = 0, length = fileList.length, toSend = [], self = this, handle = new StoreHandle();
|
||||
var lastProcessedMetaLength;
|
||||
fileList.forEach(function (bufferOrFile) {
|
||||
var fileNameText = typeof bufferOrFile == 'string' ? bufferOrFile : 'buffer';
|
||||
DicomMessage.readMetaHeader(bufferOrFile, function (err, metaMessage, metaLength) {
|
||||
read++;
|
||||
if (err) {
|
||||
handle.emit('file', err, fileNameText);
|
||||
if (read == length && toSend.length > 0 && lastProcessedMetaLength) {
|
||||
sendProcessedFiles(self, contexts, toSend, handle, lastProcessedMetaLength);
|
||||
}
|
||||
return;
|
||||
}
|
||||
console.log('Dicom file ' + (typeof bufferOrFile == 'string' ? bufferOrFile : 'buffer') + ' found');
|
||||
lastProcessedMetaLength = metaLength;
|
||||
var syntax = metaMessage.getValue(0x00020010),
|
||||
sopClassUID = metaMessage.getValue(0x00020002),
|
||||
instanceUID = metaMessage.getValue(0x00020003);
|
||||
|
||||
});
|
||||
}
|
||||
});
|
||||
if (!contexts[sopClassUID]) {
|
||||
contexts[sopClassUID] = [];
|
||||
}
|
||||
if (syntax && contexts[sopClassUID].indexOf(syntax) == -1) {
|
||||
contexts[sopClassUID].push(syntax);
|
||||
}
|
||||
toSend.push({file: bufferOrFile, context: sopClassUID, uid: instanceUID});
|
||||
|
||||
if (read == length) {
|
||||
sendProcessedFiles(self, contexts, toSend, handle, metaLength);
|
||||
}
|
||||
});
|
||||
});
|
||||
return handle;
|
||||
};
|
||||
|
||||
Connection.prototype.storeResponse = function(messageId, msg) {
|
||||
// Starts to send dcm files
|
||||
sendProcessedFiles = function (self, contexts, toSend, handle, metaLength) {
|
||||
var useContexts = [];
|
||||
for (var context in contexts) {
|
||||
var useSyntaxes = contexts[context];
|
||||
if (useSyntaxes.length > 0) {
|
||||
useContexts.push({context: context, syntaxes: contexts[context]});
|
||||
} else {
|
||||
throw "No syntax specified for context " + context;
|
||||
}
|
||||
}
|
||||
|
||||
self.associate({
|
||||
contexts: useContexts
|
||||
}, function (ac) {
|
||||
var maxSend = ac.getMaxSize(), next = toSend.shift();
|
||||
self._sendFile(this, handle, next, maxSend, metaLength, toSend);
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
Connection.prototype.storeResponse = function (messageId, msg) {
|
||||
var rq = this.messages[messageId];
|
||||
|
||||
if (rq.listener[2]) {
|
||||
@@ -175,36 +185,36 @@ Connection.prototype.storeResponse = function(messageId, msg) {
|
||||
}
|
||||
};
|
||||
|
||||
Connection.prototype.allClosed = function() {
|
||||
Connection.prototype.allClosed = function () {
|
||||
var allClosed = true;
|
||||
for (var i in o.peerSockets) {
|
||||
if (Object.keys(o.peerSockets[ae]).length > 0) {
|
||||
allClosed = false;
|
||||
break;
|
||||
}
|
||||
if (Object.keys(o.peerSockets[ae]).length > 0) {
|
||||
allClosed = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return allClosed;
|
||||
};
|
||||
|
||||
Connection.prototype.addSocket = function(ae, socket) {
|
||||
Connection.prototype.addSocket = function (ae, socket) {
|
||||
if (!this.peerSockets[ae]) {
|
||||
this.peerSockets[ae] = {};
|
||||
this.peerSockets[ae] = {};
|
||||
}
|
||||
this.peerSockets[ae][socket.id] = socket;
|
||||
|
||||
var o = this;
|
||||
socket.on("close", function() {
|
||||
if (o.peerSockets[ae][this.id]) {
|
||||
delete o.peerSockets[ae][this.id];
|
||||
}
|
||||
socket.on("close", function () {
|
||||
if (o.peerSockets[ae][this.id]) {
|
||||
delete o.peerSockets[ae][this.id];
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Connection.prototype.associate = function(options, callback) {
|
||||
Connection.prototype.associate = function (options, callback) {
|
||||
var hostAE = options.hostAE ? options.hostAE : this.defaultPeer,
|
||||
sourceAE = options.sourceAE ? options.sourceAE : this.defaultServer;
|
||||
if (!hostAE || !sourceAE) {
|
||||
throw "Peers not provided or no defaults in settings";
|
||||
throw "Peers not provided or no defaults in settings";
|
||||
}
|
||||
|
||||
var peerInfo = this.selectPeer(hostAE), nativeSocket = new Socket();
|
||||
@@ -216,18 +226,18 @@ Connection.prototype.associate = function(options, callback) {
|
||||
socket.setCallingAE(sourceAE);
|
||||
|
||||
nativeSocket.connect({
|
||||
host : peerInfo.host, port : peerInfo.port
|
||||
}, function(){
|
||||
//connected
|
||||
o.addSocket(hostAE, socket);
|
||||
host: peerInfo.host, port: peerInfo.port
|
||||
}, function () {
|
||||
//connected
|
||||
o.addSocket(hostAE, socket);
|
||||
|
||||
if (options.contexts) {
|
||||
socket.setPresentationContexts(options.contexts);
|
||||
} else {
|
||||
throw "Contexts must be specified";
|
||||
}
|
||||
if (options.contexts) {
|
||||
socket.setPresentationContexts(options.contexts);
|
||||
} else {
|
||||
throw "Contexts must be specified";
|
||||
}
|
||||
|
||||
socket.associate();
|
||||
socket.associate();
|
||||
});
|
||||
|
||||
return socket;
|
||||
|
||||
Reference in new issue
Block a user