/** * @brief Convert value to desired type. * @param [in, out] value Value to convert. * @param [in] nType Type to convert to. * @return true if conversion succeeded, false otherwise. * @note Currently converts only strings and integers. * @todo Add other conversions. */ bool COption::ConvertType(varprop::VariantValue & value, varprop::VT_TYPE nType) { if (value.GetType() == varprop::VT_STRING) return ConvertString(value, nType); if (value.GetType() == varprop::VT_INT) return ConvertInteger(value, nType); return false; }
void IGFManager :: EnumThreadList(int parentID, MULTISTRING &output) { IGFCategory* category = GetPagedCategoryPtr(parentID); if(category == NULL) return; //Pregenerate a list of threads std::vector<IGFThread*> results; for(size_t i = 0; i < category->mThreadList.size(); i++) { IGFThread* thread = GetPagedThreadPtr(category->mThreadList[i]); if(thread != NULL) results.push_back(thread); } if(category->mFlags.hasFlag(IGFFlags::FLAG_SORTALPHABETICAL)) std::sort(results.begin(), results.end(), ThreadSortAlphabetical); STRINGLIST entry; for(size_t i = 0; i < results.size(); i++) { IGFThread* thread = results[i]; entry.push_back(ConvertInteger(TYPE_THREAD)); entry.push_back(ConvertInteger(thread->mID)); entry.push_back(ConvertInteger(thread->mLocked)); entry.push_back(ConvertInteger(thread->mStickied)); entry.push_back(thread->mTitle); entry.push_back(ConvertInteger(thread->mPostList.size())); entry.push_back(ConvertInteger(GetTimeOffset(thread->mLastUpdateTime))); output.push_back(entry); entry.clear(); } }
void IGFManager :: EnumCategoryList(int parentID, MULTISTRING &output) { STRINGLIST entry; CATEGORYPAGE::iterator it; IGFCategoryPage::CATEGORYENTRY::iterator eit; for(it = mCategoryPages.begin(); it != mCategoryPages.end(); ++it) { for(eit = it->second.mEntries.begin(); eit != it->second.mEntries.end(); ++eit) { if(eit->second.mParentCategory == parentID) { entry.push_back(ConvertInteger(TYPE_CATEGORY)); entry.push_back(ConvertInteger(eit->second.mID)); entry.push_back(ConvertInteger(eit->second.mLocked)); entry.push_back(ConvertInteger(0)); //Stickied. Categories don't have this. entry.push_back(eit->second.mTitle); entry.push_back(ConvertInteger(eit->second.mThreadList.size())); entry.push_back(ConvertInteger(GetTimeOffset(eit->second.mLastUpdateTime))); output.push_back(entry); entry.clear(); } } } }
void IGFManager :: OpenThread(int threadID, int startPost, int requestedCount, MULTISTRING &output) { IGFThread *thread = GetPagedThreadPtr(threadID); if(thread == NULL) return; startPost = Util::ClipInt(startPost, 0, thread->mPostList.size() - 1); STRINGLIST row; //We retrieve the time offset since the first session since the client uses //4 byte integers which theoretically may not be large enough to hold the time data. unsigned long timeOffset = g_PlatformTime.getAbsoluteMinutes(); //Prepare the header row.push_back(ConvertInteger(threadID)); //[0] row.push_back(thread->mTitle); //[1] row.push_back(ConvertInteger(startPost)); //[2] row.push_back(ConvertInteger(thread->mPostList.size())); //[3] row.push_back(ConvertInteger(timeOffset - thread->mLastUpdateTime)); //[4] output.push_back(row); row.clear(); //Append the post data. int count = 0; for(size_t i = startPost; i < thread->mPostList.size(); i++) { IGFPost *post = GetPagedPostPtr(thread->mPostList[i]); if(post == NULL) { g_Logs.data->error("OpenThread: unable to find post: %v", thread->mPostList[i]); continue; } row.push_back(ConvertInteger(post->mID)); //[0] row.push_back(post->mCreatorName.c_str()); //[1] row.push_back(post->mCreationTime.c_str()); //[2] row.push_back(ConvertInteger(timeOffset - post->mPostedTime)); //[3] row.push_back(post->mBodyText.c_str()); //[4] row.push_back(ConvertInteger(post->mEditCount)); //[5] row.push_back(ConvertInteger(timeOffset - post->mLastUpdateTime)); //[6] output.push_back(row); row.clear(); if(++count >= requestedCount) break; } }
void IGFManager :: GetCategory(int id, MULTISTRING &output) { IGFCategory *category = GetPagedCategoryPtr(id); if(category == NULL) return; STRINGLIST header; header.push_back(ConvertInteger(id)); header.push_back(category->mTitle); output.push_back(header); EnumCategoryList(id, output); EnumThreadList(id, output); }
void IGFManager :: OpenCategory(int type, int id, MULTISTRING &output) { //Expand an object. If it's a category, enumerate a list of subcategories. if(type == TYPE_CATEGORY) { IGFCategory *category = GetPagedCategoryPtr(id); if(category != NULL) { STRINGLIST header; header.push_back(ConvertInteger(id)); header.push_back(category->mTitle); output.push_back(header); int searchID = category->mID; EnumCategoryList(searchID, output); EnumThreadList(searchID, output); } } }