summaryrefslogtreecommitdiff
path: root/XMPCore/source/PathImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'XMPCore/source/PathImpl.cpp')
-rw-r--r--XMPCore/source/PathImpl.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/XMPCore/source/PathImpl.cpp b/XMPCore/source/PathImpl.cpp
new file mode 100644
index 0000000..4589c79
--- /dev/null
+++ b/XMPCore/source/PathImpl.cpp
@@ -0,0 +1,186 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2014 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#define IMPLEMENTATION_HEADERS_CAN_BE_INCLUDED 1
+ #include "XMPCore/ImplHeaders/PathImpl.h"
+#undef IMPLEMENTATION_HEADERS_CAN_BE_INCLUDED
+
+#include "XMPCommon/Interfaces/IError_I.h"
+#include "XMPCore/XMPCoreErrorCodes.h"
+#include "XMPCommon/Interfaces/IUTF8String_I.h"
+#include "XMPCore/Interfaces/IPathSegment.h"
+#include "XMPCore/Interfaces/INameSpacePrefixMap_I.h"
+#include "XMPCommon/Utilities/UTF8String.h"
+#include "XMPCommon/Utilities/TSmartPointers_I.h"
+
+namespace AdobeXMPCore_Int {
+
+ // All virtual functions
+
+ spcINameSpacePrefixMap APICALL PathImpl::RegisterNameSpacePrefixMap( const spcINameSpacePrefixMap & map ) {
+ spcINameSpacePrefixMap old = mNameSpacePrefixMap;
+ mNameSpacePrefixMap = map->Clone();
+ return old;
+ }
+
+ static const char * sSegmentSeperator = "/";
+ static const char * sValueSeperator = ":";
+ static const char * sQualifierIndicator = "@";
+ static const char * sValueIndicatorBegin = "[";
+ static const char * sValueIndicatorEnd = "]";
+ static const char * sQualifierValueIndicator = "?";
+ static const char * sQualifierValueSeperator = "=";
+ static const char * sQuotes = "\"";
+
+ spIUTF8String APICALL PathImpl::Serialize( const spcINameSpacePrefixMap & map ) const {
+ bool firstSegment = true;
+
+ auto it = mSegments.begin();
+ auto endIt = mSegments.end();
+ spIUTF8String serailizedOutput = IUTF8String_I::CreateUTF8String();
+
+ for (it = mSegments.begin(); it != endIt; it++) {
+ spcIUTF8String nameSpace = it->get()->GetNameSpace();
+ spcIUTF8String nameSpaceOrPrefix;
+
+ if (!map && !mNameSpacePrefixMap)
+ nameSpaceOrPrefix = nameSpace;
+
+ if (map)
+ nameSpaceOrPrefix = map->GetINameSpacePrefixMap_I()->GetPrefix(nameSpace);
+ if (!nameSpaceOrPrefix && mNameSpacePrefixMap)
+ nameSpaceOrPrefix = mNameSpacePrefixMap->GetINameSpacePrefixMap_I()->GetPrefix(nameSpace);
+
+ if (!nameSpaceOrPrefix)
+ NOTIFY_ERROR(IError_v1::kEDDataModel, kDMECNameSpacePrefixMapEntryMissing,
+ "A required entry missing in the provided mapping table", IError_v1::kESOperationFatal, false, false);
+
+ switch (it->get()->GetType()) {
+ case IPathSegment_v1::kPSTProperty:
+ if (!firstSegment) {
+ serailizedOutput->append(sSegmentSeperator, npos);
+ }
+ serailizedOutput->append(nameSpaceOrPrefix)->append(sValueSeperator, npos)->append(it->get()->GetName());
+ break;
+
+ case IPathSegment_v1::kPSTArrayIndex:
+ {
+ //std::string strIndex = std::to_string(it->get()->GetIndex());
+ std::ostringstream oss;
+ oss << (it->get()->GetIndex());
+ std::string strIndex = oss.str();
+ serailizedOutput->append(sValueIndicatorBegin, npos)->append(strIndex.c_str(), strIndex.size())->append(sValueIndicatorEnd, npos);
+ }
+ break;
+
+ case IPathSegment_v1::kPSTQualifier:
+ if (!firstSegment) {
+ serailizedOutput->append(sSegmentSeperator, npos);
+ }
+ serailizedOutput->append(sQualifierIndicator, npos)->append(nameSpaceOrPrefix)->append(sValueSeperator, npos)->append(it->get()->GetName());
+ break;
+
+ case IPathSegment_v1::kPSTQualifierSelector:
+ serailizedOutput->append(sValueIndicatorBegin, npos)->append(sQualifierValueIndicator, npos)->append(it->get()->GetName())->
+ append(sQualifierValueSeperator, npos)->append(sQuotes, npos)->append(it->get()->GetValue())->
+ append(sQuotes, npos)->append(sValueIndicatorEnd, npos);
+
+ default:
+ break;
+ }
+
+ if (firstSegment) {
+ firstSegment = false;
+ }
+ }
+
+ return serailizedOutput;
+
+ }
+
+ void APICALL PathImpl::AppendPathSegment( const spcIPathSegment & segment ) {
+ if ( !segment )
+ NOTIFY_ERROR( IError_v1::kEDGeneral, kGECParametersNotAsExpected,
+ "Parameters to PathImpl::AppendPathSegment are not as expected", IError_v1::kESOperationFatal,
+ true, ( void * ) segment.get() );
+
+ mSegments.push_back( segment );
+ }
+
+ spcIPathSegment APICALL PathImpl::RemovePathSegment( sizet index ) {
+ if ( index - 1 >= mSegments.size() ) {
+ NOTIFY_ERROR( IError_v1::kEDGeneral, kGECIndexOutOfBounds,
+ "Requested Index to PathImpl::RemovePathSegment is out of bounds", IError_v1::kESOperationFatal, true, Size(), true, index );
+ } else {
+ spcIPathSegment returnValue = mSegments[ index - 1 ];
+ mSegments.erase( mSegments.begin() + index - 1 );
+ return returnValue;
+ }
+ return spcIPathSegment();
+ }
+
+ spcIPathSegment APICALL PathImpl::GetPathSegment( sizet index ) const {
+ if ( index - 1 >= mSegments.size() ) {
+ NOTIFY_ERROR( IError_v1::kEDGeneral, kGECIndexOutOfBounds,
+ "Requested Index to PathImpl::GetPathSegment is out of bounds", IError_v1::kESOperationFatal, true, Size(), true, index );
+ } else {
+ return mSegments[ index - 1 ];
+ }
+ return spcIPathSegment();
+ }
+
+ AdobeXMPCommon::sizet PathImpl::Size() const __NOTHROW__ {
+ return mSegments.size();
+ }
+
+ void APICALL PathImpl::Clear() __NOTHROW__ {
+ mSegments.clear();
+ }
+
+ spIPath APICALL PathImpl::Clone( sizet startingIndex, sizet countOfSegments ) const {
+ sizet totalCountOfSegments = mSegments.size();
+
+ if ( startingIndex - 1 >= totalCountOfSegments ) {
+ NOTIFY_ERROR( IError_v1::kEDGeneral, kGECIndexOutOfBounds,
+ "Requested startIndex to PathImpl::Clone is out of bounds", IError_v1::kESOperationFatal, true, Size(), true, startingIndex );
+ }
+ spIPath newPath = MakeUncheckedSharedPointer( new PathImpl(), __FILE__, __LINE__, true );
+
+ for ( sizet index = startingIndex; countOfSegments != 0; countOfSegments--, index++ ) {
+ newPath->AppendPathSegment( mSegments[ index - 1 ] );
+ if ( index == totalCountOfSegments )
+ break;
+ }
+ if ( mNameSpacePrefixMap )
+ newPath->RegisterNameSpacePrefixMap( mNameSpacePrefixMap->Clone() );
+ return newPath;
+ }
+
+}
+
+#if BUILDING_XMPCORE_LIB || SOURCE_COMPILING_XMPCORE_LIB
+namespace AdobeXMPCore {
+ using namespace AdobeXMPCore_Int;
+
+ spIPath IPath_v1::MakeShared( pIPath_base ptr ) {
+ if ( !ptr ) return spIPath();
+ pIPath p = IPath::GetInterfaceVersion() > 1 ? ptr->GetInterfacePointer< IPath >() : ptr;
+ return MakeUncheckedSharedPointer( p, __FILE__, __LINE__, false );
+ }
+
+ spIPath IPath_v1::CreatePath() {
+ return MakeUncheckedSharedPointer( new PathImpl(), __FILE__, __LINE__, true );
+ }
+
+ spIPath IPath_v1::ParsePath( const char * path, sizet pathLength, const spcINameSpacePrefixMap & map ) {
+ NOTIFY_ERROR( IError::kEDGeneral, kGECNotImplemented, "API is not implemented", IError::kESOperationFatal, true, "ParsePath" );
+ }
+
+}
+#endif // BUILDING_XMPCORE_LIB || SOURCE_COMPILING_XMPCORE_LIB