void FullpipeEngine::initObjectStates() { setLevelStates(); setObjectState(sO_Dude, getObjectEnumState(sO_Dude, sO_NotCarryingEgg)); setObjectState(sO_EggCracker, getObjectEnumState(sO_EggCracker, sO_DidNotCrackEgg)); setObjectState(sO_GuvTheDrawer, getObjectEnumState(sO_GuvTheDrawer, sO_Awaken)); setObjectState(sO_EggGulper, getObjectEnumState(sO_EggGulper, sO_First)); setObjectState(sO_EggGulperGaveCoin, getObjectEnumState(sO_EggGulperGaveCoin, sO_No)); setObjectState(sO_Jar_4, getObjectEnumState(sO_Jar_4, sO_OnTheSpring)); setObjectState(sO_GulpedEggs, getObjectEnumState(sO_GulpedEgg, sO_NotPresent)); setSwallowedEggsState(); setObjectState(sO_WeirdWacko, getObjectEnumState(sO_WeirdWacko, sO_InGlasses)); setObjectState(sO_TumyTrampie, getObjectEnumState(sO_TumyTrampie, sO_Drinking)); setObjectState(sO_StairsUp_8, getObjectEnumState(sO_StairsUp_8, sO_NotBroken)); setObjectState(sO_HareTheNooksiter, getObjectEnumState(sO_HareTheNooksiter, sO_WithHandle)); setObjectState(sO_Elephantine, getObjectEnumState(sO_Elephantine, sO_WithBoot)); setObjectState(sO_Fly_12, 0); setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_NotAvailable)); setObjectState(sO_ClockHandle, getObjectEnumState(sO_ClockHandle, sO_In_7)); setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_Sleeping)); setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty)); setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple)); setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked)); setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe)); setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug)); setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum)); setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging)); setObjectState(sO_DudeJumped, getObjectEnumState(sO_DudeJumped, sO_No)); setObjectState(sO_Bridge, getObjectEnumState(sO_Bridge, sO_Convoluted)); setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight)); setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14)); setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent)); setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe)); setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree)); setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom)); setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree)); setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin)); setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe)); setObjectState(sO_Fly_17, 1); setObjectState(sO_DudeSwinged, 0); setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging)); setObjectState(sO_Sugar, getObjectEnumState(sO_Sugar, sO_Present)); setObjectState(sO_Janitors, getObjectEnumState(sO_Janitors, sO_Together)); setObjectState(sO_Bag_22, getObjectEnumState(sO_Bag_22, sO_NotFallen)); setObjectState(sO_Grandpa, getObjectEnumState(sO_Grandpa, sO_InSock)); setObjectState(sO_CoinSlot_22, getObjectEnumState(sO_CoinSlot_22, sO_Empty)); setObjectState(sO_UpperHatch_23, getObjectEnumState(sO_UpperHatch_23, sO_Closed)); setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed)); setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken)); setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool)); setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_ClosedShe)); setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe)); setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed)); setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging)); setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_ClosedShe)); setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened)); setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed)); setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed)); setObjectState(sO_Valve4_26, getObjectEnumState(sO_Valve4_26, sO_Closed)); setObjectState(sO_Valve5_26, getObjectEnumState(sO_Valve5_26, sO_Opened)); setObjectState(sO_Pool, getObjectEnumState(sO_Pool, sO_Overfull)); setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs)); setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering)); setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop)); setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe)); setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe)); setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel)); setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe)); setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown)); setObjectState(sO_Fireman, getObjectEnumState(sO_Fireman, sO_WithHose)); setObjectState(sO_Cube, getObjectEnumState(sO_Cube, sO_In_33)); setObjectState(sO_MommyOfHandle_32, getObjectEnumState(sO_MommyOfHandle_32, sO_WithoutHandle)); setObjectState(sO_Pedestal_33, getObjectEnumState(sO_Pedestal_33, sO_IsFree)); setObjectState(sO_Valve_34, getObjectEnumState(sO_Valve_34, sO_WithNothing)); setObjectState(sO_Stool_34, getObjectEnumState(sO_Stool_34, sO_WithoutDrawer)); setObjectState(sO_Plank_34, getObjectEnumState(sO_Plank_34, sO_Passive)); setObjectState(sO_Hatch_34, getObjectEnumState(sO_Hatch_34, sO_Closed)); setObjectState(sO_Valve_35, getObjectEnumState(sO_Valve_35, sO_TurnedOff)); setObjectState(sO_Carpet_35, getObjectEnumState(sO_Carpet_35, sO_CannotTake)); setObjectState(sO_CoinSlot_35, getObjectEnumState(sO_CoinSlot_35, sO_WithCoin)); setObjectState(sO_BellyInflater, getObjectEnumState(sO_BellyInflater, sO_WithCork)); setObjectState(sO_Jawcrucnher, getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet)); setObjectState(sO_Guard_1, getObjectEnumState(sO_Guard_1, sO_On)); setObjectState(sO_Gurad_2, getObjectEnumState(sO_Gurad_2, sO_On)); setObjectState(sO_Guard_3, getObjectEnumState(sO_Guard_3, sO_On)); setObjectState(sO_Bottle_38, getObjectEnumState(sO_Bottle_38, sO_OnTheTable)); setObjectState(sO_Boss, getObjectEnumState(sO_Boss, sO_WithHammer)); }
/*------------------------------------ initObject ---*/ bool initObject(UdpObjectData * xx, const long port, const long numBuffers) { bool okSoFar = true; if (xx) { long buffSize = static_cast<long>(BUFF_MEMORY_TO_ALLOC * (numBuffers + 2)); xx->fSelfPort = static_cast<unsigned short>(port ? port : DEFAULT_PORT); memset(&xx->fPartnerAddress, 0, sizeof(xx->fPartnerAddress)); xx->fPartnerPort = 0; xx->fPartnerKnown = false; xx->fErrorBangOut = static_cast<t_outlet *>(bangout(xx)); xx->fResultOut = static_cast<t_outlet *>(outlet_new(xx, NULL)); setObjectState(xx, kUdpStateUnbound); xx->fSocket = NULL; xx->fErrorQueue = MAKE_QELEM(xx, processErrorQueue); xx->fReceiveQueue = MAKE_QELEM(xx, processReceiveQueue); xx->fBufferBase = reinterpret_cast<DataBuffer **>(sysmem_newhandle(buffSize)); if (xx->fBufferBase) { sysmem_lockhandle(reinterpret_cast<t_handle>(xx->fBufferBase), 1); xx->fSendBuffer = *xx->fBufferBase; xx->fReceiveBuffer = reinterpret_cast<DataBuffer *>(ADD_TO_ADDRESS(xx->fSendBuffer, BUFF_MEMORY_TO_ALLOC)); } xx->fLinkBase = MAKE_TYPED_HANDLE(UdpBufferLink, numBuffers); if (xx->fLinkBase) { DataBuffer * this_buffer = reinterpret_cast<DataBuffer *>(ADD_TO_ADDRESS(xx->fReceiveBuffer, BUFF_MEMORY_TO_ALLOC)); UdpBufferLink * prev_link = NULL; UdpBufferLink * this_link = NULL; sysmem_lockhandle(reinterpret_cast<t_handle>(xx->fLinkBase), 1); xx->fPoolHead = *xx->fLinkBase; this_link = xx->fPoolHead; for (long link_count = 0; link_count < numBuffers; ++link_count) { this_link->fPrevious = prev_link; this_link->fData = this_buffer; this_buffer = reinterpret_cast<DataBuffer *>(ADD_TO_ADDRESS(this_buffer, BUFF_MEMORY_TO_ALLOC)); this_link->fNext = NULL; if (prev_link) { prev_link->fNext = this_link; } prev_link = this_link; this_link = reinterpret_cast<UdpBufferLink *>(ADD_TO_ADDRESS(this_link, sizeof(UdpBufferLink))); } xx->fPoolTail = prev_link; } xx->fClosing = xx->fRawMode = false; if (! (xx->fResultOut && xx->fErrorBangOut && xx->fErrorQueue && xx->fBufferBase && xx->fReceiveQueue && xx->fLinkBase)) { LOG_ERROR_1(xx, OUTPUT_PREFIX "unable to create port or buffer for object") okSoFar = false; } } return okSoFar; } // initObject
/*------------------------------------ udpPortSetPort ---*/ bool udpPortSetPort(UdpObjectData * xx, const bool bangOnError) { bool okSoFar = true; if (xx) { if (xx->fSocket) { CFSocketInvalidate(xx->fSocket); CFRelease(xx->fSocket); xx->fSocket = NULL; } int err; int sock = socket(AF_INET, SOCK_DGRAM, 0); if (0 > sock) { err = errno; okSoFar = false; } else { err = 0; } if (okSoFar) { sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_len = sizeof(addr); addr.sin_family = AF_INET; addr.sin_port = htons(xx->fSelfPort); addr.sin_addr.s_addr = INADDR_ANY; err = bind(sock, reinterpret_cast<sockaddr *>(&addr), sizeof(addr)); if (0 > err) { err = errno; okSoFar = false; } } if (okSoFar) { int flags = fcntl(sock, F_GETFL); err = fcntl(sock, F_SETFL, flags | O_NONBLOCK); if (0 > err) { err = errno; okSoFar = false; } } if (okSoFar) { const CFSocketContext context = { 0, xx, NULL, NULL, NULL }; xx->fSocket = CFSocketCreateWithNative(kCFAllocatorDefault, sock, kCFSocketReadCallBack, socketReadCallback, &context); sock = -1; CFRunLoopSourceRef rls = CFSocketCreateRunLoopSource(kCFAllocatorDefault, xx->fSocket, 0); CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode); CFRelease(rls); setObjectState(xx, kUdpStateBound); } if (! okSoFar) { close(sock); LOG_ERROR_2(xx, OUTPUT_PREFIX "set port failed (%ld)", static_cast<long>(err)) if (bangOnError) { signalError(xx); } } }
void TransfersSyncronizer::load(std::istream& is) { m_sync.load(is); StdInputStream inputStream(is); CryptoNote::BinaryInputStreamSerializer s(inputStream); uint32_t version = 0; s(version, "version"); if (version > TRANSFERS_STORAGE_ARCHIVE_VERSION) { throw std::runtime_error("TransfersSyncronizer version mismatch"); } struct ConsumerState { PublicKey viewKey; std::string state; std::vector<std::pair<AccountPublicAddress, std::string>> subscriptionStates; }; std::vector<ConsumerState> updatedStates; try { size_t subscriptionCount = 0; s.beginArray(subscriptionCount, "consumers"); while (subscriptionCount--) { s.beginObject(""); PublicKey viewKey; s(viewKey, "view_key"); std::string blob; s(blob, "state"); auto subIter = m_consumers.find(viewKey); if (subIter != m_consumers.end()) { auto consumerState = m_sync.getConsumerState(subIter->second.get()); assert(consumerState); { // store previous state auto prevConsumerState = getObjectState(*consumerState); // load consumer state setObjectState(*consumerState, blob); updatedStates.push_back(ConsumerState{ viewKey, std::move(prevConsumerState) }); } // load subscriptions size_t subCount = 0; s.beginArray(subCount, "subscriptions"); while (subCount--) { s.beginObject(""); AccountPublicAddress acc; std::string state; s(acc, "address"); s(state, "state"); auto sub = subIter->second->getSubscription(acc); if (sub != nullptr) { auto prevState = getObjectState(sub->getContainer()); setObjectState(sub->getContainer(), state); updatedStates.back().subscriptionStates.push_back(std::make_pair(acc, prevState)); } else { m_logger(Logging::DEBUGGING) << "Subscription not found: " << m_currency.accountAddressAsString(acc); } s.endObject(); } s.endArray(); } else { m_logger(Logging::DEBUGGING) << "Consumer not found: " << viewKey; } s.endObject(); } s.endArray(); } catch (...) { // rollback state for (const auto& consumerState : updatedStates) { auto consumer = m_consumers.find(consumerState.viewKey)->second.get(); setObjectState(*m_sync.getConsumerState(consumer), consumerState.state); for (const auto& sub : consumerState.subscriptionStates) { setObjectState(consumer->getSubscription(sub.first)->getContainer(), sub.second); } } throw; } }