# HG changeset patch # User Sebastien Jodogne # Date 1464169835 -7200 # Node ID f9f2aa1cc594d17760fef6e750e7b8b90263fc93 # Parent 66957f5c69abb3877dd9ddd35f753c9833653c8a "MoveOriginatorID" can be specified for /modalities/.../store diff -r 66957f5c69ab -r f9f2aa1cc594 NEWS --- a/NEWS Wed May 25 07:24:10 2016 +0200 +++ b/NEWS Wed May 25 11:50:35 2016 +0200 @@ -31,6 +31,11 @@ * Access to the HTTP headers in the "IncomingHttpRequestFilter()" callback +REST API +-------- + +* "MoveOriginatorID" can be specified for /modalities/.../store + Maintenance ----------- diff -r 66957f5c69ab -r f9f2aa1cc594 OrthancServer/DicomProtocol/DicomUserConnection.cpp --- a/OrthancServer/DicomProtocol/DicomUserConnection.cpp Wed May 25 07:24:10 2016 +0200 +++ b/OrthancServer/DicomProtocol/DicomUserConnection.cpp Wed May 25 11:50:35 2016 +0200 @@ -151,7 +151,7 @@ void Store(DcmInputStream& is, DicomUserConnection& connection, - uint16_t moveMessageID); + uint16_t moveOriginatorID); }; @@ -256,7 +256,7 @@ void DicomUserConnection::PImpl::Store(DcmInputStream& is, DicomUserConnection& connection, - uint16_t moveMessageID) + uint16_t moveOriginatorID) { CheckIsOpen(); @@ -342,9 +342,9 @@ connection.GetLocalApplicationEntityTitle().c_str(), DIC_AE_LEN); request.opts = O_STORE_MOVEORIGINATORAETITLE; - if (moveMessageID != 0) + if (moveOriginatorID != 0) { - request.MoveOriginatorID = moveMessageID; // The type DIC_US is an alias for uint16_t + request.MoveOriginatorID = moveOriginatorID; // The type DIC_US is an alias for uint16_t request.opts |= O_STORE_MOVEORIGINATORID; } @@ -939,7 +939,7 @@ void DicomUserConnection::Store(const char* buffer, size_t size, - uint16_t moveMessageID) + uint16_t moveOriginatorID) { // Prepare an input stream for the memory buffer DcmInputBufferStream is; @@ -947,24 +947,24 @@ is.setBuffer(buffer, size); is.setEos(); - pimpl_->Store(is, *this, moveMessageID); + pimpl_->Store(is, *this, moveOriginatorID); } void DicomUserConnection::Store(const std::string& buffer, - uint16_t moveMessageID) + uint16_t moveOriginatorID) { if (buffer.size() > 0) - Store(reinterpret_cast(&buffer[0]), buffer.size(), moveMessageID); + Store(reinterpret_cast(&buffer[0]), buffer.size(), moveOriginatorID); else - Store(NULL, 0, moveMessageID); + Store(NULL, 0, moveOriginatorID); } void DicomUserConnection::StoreFile(const std::string& path, - uint16_t moveMessageID) + uint16_t moveOriginatorID) { // Prepare an input stream for the file DcmInputFileStream is(path.c_str()); - pimpl_->Store(is, *this, moveMessageID); + pimpl_->Store(is, *this, moveOriginatorID); } bool DicomUserConnection::Echo() diff -r 66957f5c69ab -r f9f2aa1cc594 OrthancServer/DicomProtocol/DicomUserConnection.h --- a/OrthancServer/DicomProtocol/DicomUserConnection.h Wed May 25 07:24:10 2016 +0200 +++ b/OrthancServer/DicomProtocol/DicomUserConnection.h Wed May 25 11:50:35 2016 +0200 @@ -135,13 +135,13 @@ void Store(const char* buffer, size_t size, - uint16_t moveMessageID); + uint16_t moveOriginatorID); void Store(const std::string& buffer, - uint16_t moveMessageID); + uint16_t moveOriginatorID); void StoreFile(const std::string& path, - uint16_t moveMessageID); + uint16_t moveOriginatorID); void Find(DicomFindAnswers& result, ResourceType level, diff -r 66957f5c69ab -r f9f2aa1cc594 OrthancServer/OrthancRestApi/OrthancRestModalities.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp Wed May 25 07:24:10 2016 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp Wed May 25 11:50:35 2016 +0200 @@ -683,10 +683,41 @@ return; } + static const char* LOCAL_AET = "LocalAet"; std::string localAet = context.GetDefaultLocalApplicationEntityTitle(); - if (request.isMember("LocalAet")) + if (request.type() == Json::objectValue && + request.isMember(LOCAL_AET)) { - localAet = request["LocalAet"].asString(); + if (request[LOCAL_AET].type() == Json::stringValue) + { + localAet = request[LOCAL_AET].asString(); + } + else + { + throw OrthancException(ErrorCode_BadFileFormat); + } + } + + uint16_t moveOriginatorID = 0; /* By default, not a C-MOVE */ + + static const char* MOVE_ORIGINATOR_ID = "MoveOriginatorID"; + if (request.type() == Json::objectValue && + request.isMember(MOVE_ORIGINATOR_ID)) + { + if (request[MOVE_ORIGINATOR_ID].type() != Json::intValue) + { + throw OrthancException(ErrorCode_BadFileFormat); + } + + int v = request[MOVE_ORIGINATOR_ID].asInt(); + if (v <= 0 || v >= 65536) + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + else + { + moveOriginatorID = boost::lexical_cast(v); + } } RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName(remote); @@ -696,7 +727,7 @@ it = instances.begin(); it != instances.end(); ++it) { job.AddCommand(new StoreScuCommand(context, localAet, p, false, - 0 /* not a C-MOVE */)).AddInput(*it); + moveOriginatorID)).AddInput(*it); } job.SetDescription("HTTP request: Store-SCU to peer \"" + remote + "\""); diff -r 66957f5c69ab -r f9f2aa1cc594 OrthancServer/Scheduler/StoreScuCommand.cpp --- a/OrthancServer/Scheduler/StoreScuCommand.cpp Wed May 25 07:24:10 2016 +0200 +++ b/OrthancServer/Scheduler/StoreScuCommand.cpp Wed May 25 11:50:35 2016 +0200 @@ -41,12 +41,12 @@ const std::string& localAet, const RemoteModalityParameters& modality, bool ignoreExceptions, - uint16_t moveMessageID) : + uint16_t moveOriginatorID) : context_(context), modality_(modality), ignoreExceptions_(ignoreExceptions), localAet_(localAet), - moveMessageID_(moveMessageID) + moveOriginatorID_(moveOriginatorID) { } @@ -66,7 +66,7 @@ std::string dicom; context_.ReadFile(dicom, *it, FileContentType_Dicom); - locker.GetConnection().Store(dicom, moveMessageID_); + locker.GetConnection().Store(dicom, moveOriginatorID_); // Only chain with other commands if this command succeeds outputs.push_back(*it); diff -r 66957f5c69ab -r f9f2aa1cc594 OrthancServer/Scheduler/StoreScuCommand.h --- a/OrthancServer/Scheduler/StoreScuCommand.h Wed May 25 07:24:10 2016 +0200 +++ b/OrthancServer/Scheduler/StoreScuCommand.h Wed May 25 11:50:35 2016 +0200 @@ -44,15 +44,15 @@ RemoteModalityParameters modality_; bool ignoreExceptions_; std::string localAet_; - uint16_t moveMessageID_; + uint16_t moveOriginatorID_; public: StoreScuCommand(ServerContext& context, const std::string& localAet, const RemoteModalityParameters& modality, bool ignoreExceptions, - uint16_t moveMessageID /* only makes sense if this - command results from a C-MOVE */); + uint16_t moveOriginatorID /* only makes sense if this + command results from a C-MOVE */); virtual bool Apply(ListOfStrings& outputs, const ListOfStrings& inputs);