int CMultiXWSStream::OngSoapSend(const char *Data,size_t Len) { char *ContinueStr = "HTTP/1.1 100 Continue"; // Length = 21 if(Len == 0) return SOAP_OK; if(m_bSendingContinue) { OutBuf().AppendData(Data,(int)Len); if(OutBuf().Length() >= 25 /* size of continue std::string + crlf +crlf */) { OutBuf().Empty(); m_bContinueSent = true; m_bSendingContinue = false; } return SOAP_OK; } if(!m_bHeaderSent) { if(memcmp(Data,ContinueStr,21) == 0) { m_bSendingContinue = true; return OngSoapSend(Data,Len); } if(memcmp(Data,"Status:",7) == 0) { Data += 7; Len -= 7; OutBuf().AppendData("HTTP/1.1",8); } m_bHeaderSent = true; } OutBuf().AppendData(Data,(int)Len); return SOAP_OK; }
int CSoftSerialDevice::Read (void *pBuffer, unsigned nCount) { char *p = (char *) pBuffer; int nResult = 0; while (!BufStat ()) { // do nothing } while ( nCount > 0 && BufStat ()) { char c = OutBuf (); *p++ = c; nCount--; nResult++; } return nResult; }
static void OutputNumber(int a) { char buf[16]; sprintf(buf,"%d ",a); OutBuf(buf); }
static void Output(char *a) { char block[512]; strcpy(block,a); OutBuf(block); }
static int PerformActions(int vb,int no) { static int disable_sysfunc=0; /* Recursion lock */ int d=BitFlags&(1<<DARKBIT); int ct=0; int fl; int doagain=0; if(vb==1 && no == -1 ) { Output("Give me a direction too."); return(0); } if(vb==1 && no>=1 && no<=6) { int nl; if(Items[LIGHT_SOURCE].Location==MyLoc || Items[LIGHT_SOURCE].Location==CARRIED) d=0; if(d) Output("Dangerous to move in the dark! "); nl=Rooms[MyLoc].Exits[no-1]; if(nl!=0) { MyLoc=nl; return(0); } if(d) { if(Options&YOUARE) Output("You fell down and broke your neck. "); else Output("I fell down and broke my neck. "); glk_exit(); } if(Options&YOUARE) Output("You can't go in that direction. "); else Output("I can't go in that direction. "); return(0); } fl= -1; while(ct<=GameHeader.NumActions) { int vv,nv; vv=Actions[ct].Vocab; /* Think this is now right. If a line we run has an action73 run all following lines with vocab of 0,0 */ if(vb!=0 && (doagain&&vv!=0)) break; /* Oops.. added this minor cockup fix 1.11 */ if(vb!=0 && !doagain && fl== 0) break; nv=vv%150; vv/=150; if((vv==vb)||(doagain&&Actions[ct].Vocab==0)) { if((vv==0 && RandomPercent(nv))||doagain|| (vv!=0 && (nv==no||nv==0))) { int f2; if(fl== -1) fl= -2; if((f2=PerformLine(ct))>0) { /* ahah finally figured it out ! */ fl=0; if(f2==2) doagain=1; if(vb!=0 && doagain==0) return(0); } } } ct++; /* Previously this did not check ct against * GameHeader.NumActions and would read past the end of * Actions. I don't know what should happen on the last * action, but doing nothing is better than reading one * past the end. * --Chris */ if(ct <= GameHeader.NumActions && Actions[ct].Vocab!=0) doagain=0; } if(fl!=0 && disable_sysfunc==0) { int i; if(Items[LIGHT_SOURCE].Location==MyLoc || Items[LIGHT_SOURCE].Location==CARRIED) d=0; if(vb==10 || vb==18) { /* Yes they really _are_ hardcoded values */ if(vb==10) { if(xstrcasecmp(NounText,"ALL")==0) { int ct=0; int f=0; if(d) { Output("It is dark.\n"); return 0; } while(ct<=GameHeader.NumItems) { if(Items[ct].Location==MyLoc && Items[ct].AutoGet!=NULL && Items[ct].AutoGet[0]!='*') { no=WhichWord(Items[ct].AutoGet,Nouns); disable_sysfunc=1; /* Don't recurse into auto get ! */ PerformActions(vb,no); /* Recursively check each items table code */ disable_sysfunc=0; if(CountCarried()==GameHeader.MaxCarry) { if(Options&YOUARE) Output("You are carrying too much. "); else Output("I've too much to carry. "); return(0); } Items[ct].Location= CARRIED; OutBuf(Items[ct].Text); Output(": O.K.\n"); f=1; } ct++; } if(f==0) Output("Nothing taken."); return(0); } if(no==-1) { Output("What ? "); return(0); } if(CountCarried()==GameHeader.MaxCarry) { if(Options&YOUARE) Output("You are carrying too much. "); else Output("I've too much to carry. "); return(0); } i=MatchUpItem(NounText,MyLoc); if(i==-1) { if(Options&YOUARE) Output("It is beyond your power to do that. "); else Output("It's beyond my power to do that. "); return(0); } Items[i].Location= CARRIED; Output("O.K. "); return(0); } if(vb==18) { if(xstrcasecmp(NounText,"ALL")==0) { int ct=0; int f=0; while(ct<=GameHeader.NumItems) { if(Items[ct].Location==CARRIED && Items[ct].AutoGet && Items[ct].AutoGet[0]!='*') { no=WhichWord(Items[ct].AutoGet,Nouns); disable_sysfunc=1; PerformActions(vb,no); disable_sysfunc=0; Items[ct].Location=MyLoc; OutBuf(Items[ct].Text); Output(": O.K.\n"); f=1; } ct++; } if(f==0) Output("Nothing dropped.\n"); return(0); } if(no==-1) { Output("What ? "); return(0); } i=MatchUpItem(NounText,CARRIED); if(i==-1) { if(Options&YOUARE) Output("It's beyond your power to do that.\n"); else Output("It's beyond my power to do that.\n"); return(0); } Items[i].Location=MyLoc; Output("O.K. "); return(0); } } } return(fl); }
CMultiXLayer::EventHandlerReturn CMultiXWSStream::OnNewRequestMessage(CMultiXEvent *Event) { CMultiXWSStreamEvent *Ev = (CMultiXWSStreamEvent *)Event; // if we have a valid message saved, we reply it with error - this will happen only if we have not replied to it before // we will also delete the message, since we do not need it any more. CMultiXAppMsg *pMsg = m_RequestMsgID.GetObject(); if(pMsg != NULL) { pMsg->Reply(TpmErrMsgCanceled); delete pMsg; } m_RequestMsgID = Ev->m_MsgID; pMsg = m_RequestMsgID.GetObject(); if(pMsg == NULL) return CMultiXLayer::DeleteEvent; bool bExit = false; while(!bExit) // we do a "while" here just so we can fall thru the end of function and delete the message object { bExit = true; if(!pMsg->IsWebServiceCall()) { pMsg->Reply(TpmErrMsgNotSupported); break; } std::string FuncName; std::string DLLName; EXPORTABLE_STL::map<int32_t,std::string>::iterator It = m_MsgCodeToFunctionMap.find(pMsg->MsgCode()); if(It != m_MsgCodeToFunctionMap.end()) { DLLName = It->second.substr(0,It->second.find("|||")); FuncName = It->second.substr(It->second.find("|||")+3); } else { DLLName = pMsg->WSDllFile(); FuncName = pMsg->WSDllFunction(); } try { InitgSoap(DLLName); } catch(...) { pMsg->Reply(WSErrgSoapDllNotFound); break; } TgSoapServiceFunction Func = (TgSoapServiceFunction)GetProcAddress(m_pFunctions->m_pDLLHandle,FuncName.c_str()); if(Func == NULL) { pMsg->Reply(WSErrServiceFunctionNotFound); break; } else if(It == m_MsgCodeToFunctionMap.end()) { m_MsgCodeToFunctionMap[pMsg->MsgCode()] = DLLName + "|||" + pMsg->WSDllFunction(); } ResetData(); if(m_pInBuf) m_pInBuf->ReturnBuffer(); m_pInBuf = pMsg->Owner()->Owner()->AllocateBuffer(pMsg->AppData(),pMsg->AppDataSize()); int Error = Func(gSoap()); if(OutBuf().Length() > 0) { pMsg->Reply(pMsg->MsgCode(),OutBuf()); } else { pMsg->Reply(Error); } } if(pMsg) delete pMsg; m_RequestMsgID.Init(); return CMultiXLayer::DeleteEvent; }