/* Copyright (C) 2016 -2017 Jerry Jin */ #include #include #include "processes.hpp" #include #include #include #include #include #include #include #include "../loop.hpp" void GeneralizedBlackScholesProcessWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(BlackVolIDLibObjPtr, mBlackVolID, QuantLibAddin::BlackVolTermStructure, QuantLib::BlackVolTermStructure) // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter DayCounterEnum = ObjectHandler::Create()(mDayCounter); // convert input datatypes to QuantLib datatypes QuantLib::Date SettlementDateLib = ObjectHandler::convert2( mSettlementDate, "SettlementDate"); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlGeneralizedBlackScholesProcess( mObjectID, mBlackVolID, mUnderlying, mDayCounter, mSettlementDate, mRiskFreeRate, mDividendYield, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::GeneralizedBlackScholesProcess( valueObject, BlackVolIDLibObjPtr, mUnderlying, DayCounterEnum, SettlementDateLib, mRiskFreeRate, mDividendYield, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void GeneralizedBlackScholesProcessWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::GeneralizedBlackScholesProcess) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsString()) { return Nan::ThrowError("BlackVolID is required."); } if (info.Length() == 2 || !info[2]->IsNumber()) { return Nan::ThrowError("Underlying is required."); } if (info.Length() == 3 || !info[3]->IsString()) { return Nan::ThrowError("DayCounter is required."); } if (info.Length() == 5 || !info[5]->IsNumber()) { return Nan::ThrowError("RiskFreeRate is required."); } if (info.Length() == 6 || !info[6]->IsNumber()) { return Nan::ThrowError("DividendYield is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type String::Utf8Value strBlackVolID(info[1]->ToString()); string BlackVolIDCpp(strdup(*strBlackVolID)); // convert js argument to c++ type double UnderlyingCpp = Nan::To(info[2]).FromJust(); // convert js argument to c++ type String::Utf8Value strDayCounter(info[3]->ToString()); string DayCounterCpp(strdup(*strDayCounter)); // convert js argument to c++ type ObjectHandler::property_t SettlementDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[4]).FromJust())); // convert js argument to c++ type double RiskFreeRateCpp = Nan::To(info[5]).FromJust(); // convert js argument to c++ type double DividendYieldCpp = Nan::To(info[6]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[7].As()); // launch Async worker Nan::AsyncQueueWorker(new GeneralizedBlackScholesProcessWorker( callback ,ObjectIDCpp ,BlackVolIDCpp ,UnderlyingCpp ,DayCounterCpp ,SettlementDateCpp ,RiskFreeRateCpp ,DividendYieldCpp )); } //GeneralizedBlackScholesProcessWorker::~GeneralizedBlackScholesProcessWorker(){ // //} //void GeneralizedBlackScholesProcessWorker::Destroy(){ // //}