PDFObject* PDFObjectParser::ParseDictionary(IPDFParserExtender* inParserExtender) { PDFDictionary* aDictionary = new PDFDictionary(); bool dictionaryEndEncountered = false; std::string token; EStatusCode status = PDFHummus::eSuccess; while(GetNextToken(token) && PDFHummus::eSuccess == status) { dictionaryEndEncountered = (scDoubleRightAngle == token); if(dictionaryEndEncountered) break; ReturnTokenToBuffer(token); // Parse Key PDFObjectCastPtr<PDFName> aKey(ParseNewObject(inParserExtender)); if(!aKey) { status = PDFHummus::eFailure; TRACE_LOG1("PDFObjectParser::ParseDictionary, failure to parse key for a dictionary. token = %s",token.c_str()); break; } // i'll consider duplicate keys as failure if(aDictionary->Exists(aKey->GetValue())) { status = PDFHummus::eFailure; TRACE_LOG1("PDFObjectParser::ParseDictionary, failure to parse key for a dictionary, key already exists. key = %s",aKey->GetValue().c_str()); break; } // Parse Value RefCountPtr<PDFObject> aValue = ParseNewObject(inParserExtender); if(!aValue) { status = PDFHummus::eFailure; TRACE_LOG1("PDFObjectParser::ParseDictionary, failure to parse value for a dictionary. token = %s",token.c_str()); break; } // all well, add the two items to the dictionary aDictionary->Insert(aKey.GetPtr(),aValue.GetPtr()); } if(dictionaryEndEncountered && PDFHummus::eSuccess == status) { return aDictionary; } else { delete aDictionary; TRACE_LOG1("PDFObjectParser::ParseDictionary, failure to parse dictionary, didn't find end of array or failure to parse dictionary member object. token = %s",token.c_str()); return NULL; } }
PDFObject* PDFObjectParser::ParseDictionary() { PDFDictionary* aDictionary = new PDFDictionary(); bool dictionaryEndEncountered = false; std::string token; EStatusCode status = PDFHummus::eSuccess; while(GetNextToken(token) && PDFHummus::eSuccess == status) { dictionaryEndEncountered = (scDoubleRightAngle == token); if(dictionaryEndEncountered) break; ReturnTokenToBuffer(token); // Parse Key PDFObjectCastPtr<PDFName> aKey(ParseNewObject()); if(!aKey) { status = PDFHummus::eFailure; TRACE_LOG1("PDFObjectParser::ParseDictionary, failure to parse key for a dictionary. token = %s",token.substr(0, MAX_TRACE_SIZE - 200).c_str()); break; } // Parse Value RefCountPtr<PDFObject> aValue = ParseNewObject(); if(!aValue) { status = PDFHummus::eFailure; TRACE_LOG1("PDFObjectParser::ParseDictionary, failure to parse value for a dictionary. token = %s",token.substr(0, MAX_TRACE_SIZE - 200).c_str()); break; } // all good. i'm gonna be forgiving here and allow skipping duplicate keys. cause it happens if(!aDictionary->Exists(aKey->GetValue())) aDictionary->Insert(aKey.GetPtr(),aValue.GetPtr()); } if(dictionaryEndEncountered && PDFHummus::eSuccess == status) { return aDictionary; } else { delete aDictionary; TRACE_LOG1("PDFObjectParser::ParseDictionary, failure to parse dictionary, didn't find end of array or failure to parse dictionary member object. token = %s",token.substr(0, MAX_TRACE_SIZE - 200).c_str()); return NULL; } }