bool f_hphp_recursiveiteratoriterator_valid(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); if (!size) return false; if (rii->m_iterators[size-1].first.is<RecursiveDirectoryIterator>()) { RecursiveDirectoryIterator *rdi = rii->m_iterators[size-1].first.getTyped<RecursiveDirectoryIterator>(); bool valid = rdi->valid(); if (valid) { if (rii->m_mode == HPHP::q_recursiveiteratoriterator_LEAVES_ONLY || rii->m_mode == HPHP::q_recursiveiteratoriterator_CHILD_FIRST) { String pathName = rdi->getPathName(); if (f_is_dir(pathName)) { if (rii->m_iterators[size-1].second > 0 && rii->m_mode == HPHP::q_recursiveiteratoriterator_CHILD_FIRST) { return true; } return false; } } } return valid; } throw InvalidArgumentException("iterator", "unsupported type"); }
bool f_hphp_recursiveiteratoriterator_valid(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); if (!size) return false; Object firstIt = rii->m_iterators[size-1].first; if (firstIt.is<RecursiveDirectoryIterator>()) { RecursiveDirectoryIterator* rdi = firstIt.getTyped<RecursiveDirectoryIterator>(); bool valid = rdi->valid(); if (valid) { if (rii->m_mode == LEAVES_ONLY || rii->m_mode == CHILD_FIRST) { String pathName = rdi->getPathName(); if (f_is_dir(pathName)) { if (rii->m_iterators[size-1].second > 0 && rii->m_mode == CHILD_FIRST) { return true; } return false; } } } return valid; } throw NotImplementedException("this type of iterator"); }
Variant f_hphp_recursiveiteratoriterator_key(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); assert(size > 0); if (rii->m_iterator.is<RecursiveDirectoryIterator>()) { ObjectData* rdi = SystemLib::AllocRecursiveDirectoryIteratorObject(); rdi->o_set("rsrc", rii->m_iterators[size-1].first, "SplFileInfo"); return f_hphp_recursivedirectoryiterator_key(rdi); } throw NotImplementedException("this type of iterator"); }
Variant f_hphp_recursiveiteratoriterator_key(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); ASSERT(size > 0); if (rii->m_iterator.is<RecursiveDirectoryIterator>()) { c_recursivedirectoryiterator *c_rdi = NEW(c_recursivedirectoryiterator)(); c_rdi->m_rsrc = rii->m_iterators[size-1].first; return f_hphp_recursivedirectoryiterator_key(c_rdi); } throw InvalidArgumentException("iterator", "unsupported type"); }
Variant f_hphp_recursiveiteratoriterator_key(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); ASSERT(size > 0); if (rii->m_iterator.is<RecursiveDirectoryIterator>()) { c_RecursiveDirectoryIterator *c_rdi = NEWOBJ(c_RecursiveDirectoryIterator)(); c_rdi->m_rsrc = rii->m_iterators[size-1].first; return f_hphp_recursivedirectoryiterator_key(c_rdi); } throw NotImplementedException("this type of iterator"); }
void f_hphp_recursiveiteratoriterator_rewind(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); rii->freeAllIterators(); rii->m_iterators.push_back(std::make_pair(rii->m_iterator.get(), 0)); rii->m_iterator->incRefCount(); if (rii->m_iterator.is<RecursiveDirectoryIterator>()) { ObjectData* rdi = SystemLib::AllocRecursiveDirectoryIteratorObject(); rdi->o_set("rsrc", rii->m_iterator, "SplFileInfo"); f_hphp_recursivedirectoryiterator_rewind(rdi); if (!f_hphp_recursiveiteratoriterator_valid(obj)) { f_hphp_recursiveiteratoriterator_next(obj); } return; } throw NotImplementedException("this type of iterator"); }
void f_hphp_recursiveiteratoriterator_rewind(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); rii->m_iterators.clear(); rii->m_iterators.push_back(std::pair<Object,bool>(rii->m_iterator, 0)); if (rii->m_iterator.is<RecursiveDirectoryIterator>()) { c_recursivedirectoryiterator *c_rdi = NEW(c_recursivedirectoryiterator)(); c_rdi->m_rsrc = rii->m_iterator; f_hphp_recursivedirectoryiterator_rewind(c_rdi); if (!f_hphp_recursiveiteratoriterator_valid(obj)) { f_hphp_recursiveiteratoriterator_next(obj); } return; } throw InvalidArgumentException("iterator", "unsupported type"); }
void f_hphp_recursiveiteratoriterator_rewind(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); rii->m_iterators.clear(); rii->m_iterators.push_back(std::pair<Object,bool>(rii->m_iterator, 0)); if (rii->m_iterator.is<RecursiveDirectoryIterator>()) { c_RecursiveDirectoryIterator *c_rdi = NEWOBJ(c_RecursiveDirectoryIterator)(); c_rdi->m_rsrc = rii->m_iterator; f_hphp_recursivedirectoryiterator_rewind(c_rdi); if (!f_hphp_recursiveiteratoriterator_valid(obj)) { f_hphp_recursiveiteratoriterator_next(obj); } return; } throw NotImplementedException("this type of iterator"); }
void f_hphp_recursiveiteratoriterator_next(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); if (!size) return; Object ci = rii->m_iterators[size-1].first; if (rii->m_mode == SELF_FIRST) { if (!ci.is<RecursiveDirectoryIterator>()) { throw NotImplementedException("this type of iterator"); } RecursiveDirectoryIterator *rdi = ci.getTyped<RecursiveDirectoryIterator>(); String pathName = rdi->getPathName(); if (f_is_dir(pathName) && !rii->m_iterators[size-1].second) { rii->m_iterators[size-1].second = 1; RecursiveDirectoryIterator *ii = NEWOBJ(RecursiveDirectoryIterator)(pathName, rdi->m_flags); rii->m_iterators.push_back(std::make_pair(ii, 0)); ii->incRefCount(); if (ii->isdot()) ii->next(); } else { rdi->next(); rii->m_iterators[size-1].second = 0; } if (f_hphp_recursiveiteratoriterator_valid(obj)) return; decRefObj(rii->m_iterators.back().first); rii->m_iterators.pop_back(); return f_hphp_recursiveiteratoriterator_next(obj); } else if (rii->m_mode == CHILD_FIRST || rii->m_mode == LEAVES_ONLY) { if (!ci.is<RecursiveDirectoryIterator>()) { throw NotImplementedException("this type of iterator"); } RecursiveDirectoryIterator *rdi = ci.getTyped<RecursiveDirectoryIterator>(); String pathName = rdi->getPathName(); if (pathName.empty()) { decRefObj(rii->m_iterators.back().first); rii->m_iterators.pop_back(); return f_hphp_recursiveiteratoriterator_next(obj); } else if (f_is_dir(pathName)) { if (!rii->m_iterators[size-1].second) { rii->m_iterators[size-1].second = 1; RecursiveDirectoryIterator *ii = NEWOBJ(RecursiveDirectoryIterator)(pathName, rdi->m_flags); rii->m_iterators.push_back(std::make_pair(ii, 0)); ii->incRefCount(); ii->rewind(); if (f_hphp_recursiveiteratoriterator_valid(obj)) return; return f_hphp_recursiveiteratoriterator_next(obj); } else { // CHILD_FIRST: 0 - drill down; 1 - visit 2 - next // LEAVES_ONLY: 0 - drill down; 1 - next if (rii->m_mode == CHILD_FIRST && rii->m_iterators[size-1].second == 1) { rii->m_iterators[size-1].second = 2; return; } } } rii->m_iterators[size-1].second = 0; rdi->next(); if (f_hphp_recursiveiteratoriterator_valid(obj)) return; return f_hphp_recursiveiteratoriterator_next(obj); } else { if (!ci.is<RecursiveDirectoryIterator>()) { throw NotImplementedException("this type of iterator"); } RecursiveDirectoryIterator *rdi = ci.getTyped<RecursiveDirectoryIterator>(); assert(rii->m_iterators[size-1].second == 0); rdi->next(); } }
Object f_hphp_recursiveiteratoriterator_getinneriterator(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); assert(size > 0); return size == 1 ? Object() : rii->m_iterators[size-1].first; }
void f_hphp_recursiveiteratoriterator_next(CObjRef obj) { RecursiveIteratorIterator *rii = get_recursiveiteratoriterator(obj); unsigned int size = rii->m_iterators.size(); if (!size) return; Object ci = rii->m_iterators[size-1].first; if (rii->m_mode == HPHP::q_recursiveiteratoriterator_SELF_FIRST) { if (!ci.is<RecursiveDirectoryIterator>()) { throw InvalidArgumentException("iterator", "unsupported type"); } RecursiveDirectoryIterator *rdi = ci.getTyped<RecursiveDirectoryIterator>(); String pathName = rdi->getPathName(); if (f_is_dir(pathName) && !rii->m_iterators[size-1].second) { rii->m_iterators[size-1].second = 1; RecursiveDirectoryIterator *ii = NEW(RecursiveDirectoryIterator)(pathName, rdi->m_flags); rii->m_iterators.push_back(std::pair<Object, bool>(ii, 0)); ii->next(); } else { rdi->next(); rii->m_iterators[size-1].second = 0; } if (f_hphp_recursiveiteratoriterator_valid(obj)) return; rii->m_iterators.pop_back(); return f_hphp_recursiveiteratoriterator_next(obj); } else if (rii->m_mode == HPHP::q_recursiveiteratoriterator_CHILD_FIRST || rii->m_mode == HPHP::q_recursiveiteratoriterator_LEAVES_ONLY) { if (!ci.is<RecursiveDirectoryIterator>()) { throw InvalidArgumentException("iterator", "unsupported type"); } RecursiveDirectoryIterator *rdi = ci.getTyped<RecursiveDirectoryIterator>(); String pathName = rdi->getPathName(); if (pathName.empty()) { rii->m_iterators.pop_back(); return f_hphp_recursiveiteratoriterator_next(obj); } else if (f_is_dir(pathName)) { if (!rii->m_iterators[size-1].second) { rii->m_iterators[size-1].second = 1; RecursiveDirectoryIterator *ii = NEW(RecursiveDirectoryIterator)(pathName, rdi->m_flags); rii->m_iterators.push_back(std::pair<Object, bool>(ii, 0)); ii->rewind(); if (f_hphp_recursiveiteratoriterator_valid(obj)) return; return f_hphp_recursiveiteratoriterator_next(obj); } else { // CHILD_FIRST: 0 - drill down; 1 - visit 2 - next // LEAVES_ONLY: 0 - drill down; 1 - next if (rii->m_mode == HPHP::q_recursiveiteratoriterator_CHILD_FIRST && rii->m_iterators[size-1].second == 1) { rii->m_iterators[size-1].second = 2; return; } } } rii->m_iterators[size-1].second = 0; rdi->next(); if (f_hphp_recursiveiteratoriterator_valid(obj)) return; return f_hphp_recursiveiteratoriterator_next(obj); } else if (rii->m_mode == HPHP::q_recursiveiteratoriterator_CATCH_GET_CHILD) { throw InvalidArgumentException("iterator", "unsupported mode"); } throw InvalidArgumentException("iterator", "unsupported mode"); }