void WorkerBinding::CreateWorker(const ValueList& args, SharedValue result) { if (args.size()!=2) { throw ValueException::FromString("invalid argument specified"); } bool is_function = args.at(1)->ToBool(); std::string code; Logger *logger = Logger::Get("Worker"); if (is_function) { // convert the function to a string block code = "("; code += args.at(0)->ToString(); code += ")()"; } else { // this is a path -- probably should verify that this is relative and not an absolute URL to remote SharedKMethod appURLToPath = global->GetNS("App.appURLToPath")->ToMethod(); ValueList a; a.push_back(args.at(0)); SharedValue result = appURLToPath->Call(a); const char *path = result->ToString(); logger->Debug("worker file path = %s",path); std::ios::openmode flags = std::ios::in; Poco::FileInputStream *fis = new Poco::FileInputStream(path,flags); std::stringstream ostr; char buf[8096]; int count = 0; while(!fis->eof()) { fis->read((char*)&buf,8095); std::streamsize len = fis->gcount(); if (len>0) { buf[len]='\0'; count+=len; ostr << buf; } else break; } fis->close(); code = std::string(ostr.str()); } logger->Debug("Worker script code = %s", code.c_str()); SharedKObject worker = new Worker(host,global,code); result->SetObject(worker); }
void FileStream::Read(const ValueList& args, SharedValue result) { if(!this->stream) { Logger* logger = Logger::Get("Filesystem.FileStream"); logger->Error("Error in read. FileStream must be opened before calling read"); throw ValueException::FromString("FileStream must be opened before calling read"); } try { std::stringstream ostr; Poco::FileInputStream* fis = dynamic_cast<Poco::FileInputStream*>(this->stream); if(!fis) { Logger* logger = Logger::Get("Filesystem.FileStream"); logger->Error("Error in read. FileInputStream is null"); throw ValueException::FromString("FileStream must be opened for reading before calling read"); } char buf[4096]; int count = 0; while(!fis->eof()) { fis->read((char*)&buf,4095); std::streamsize len = fis->gcount(); if (len>0) { buf[len]='\0'; count+=len; ostr << buf; } else break; } result->SetObject(new Blob(ostr.str().c_str(),count)); } catch (Poco::Exception& exc) { Logger* logger = Logger::Get("Filesystem.FileStream"); logger->Error("Error in read. Exception: %s",exc.displayText().c_str()); throw ValueException::FromString(exc.displayText()); } }