nsresult WSPCallContext::CallCompletionListener() { nsresult rv; #define PARAM_BUFFER_COUNT 8 /* Never set less than 2 */ if (!mProxy) { NS_ERROR("Huh, no proxy?"); return NS_OK; } nsXPTCVariant paramBuffer[PARAM_BUFFER_COUNT]; nsXPTCVariant* dispatchParams = nsnull; nsCOMPtr<nsISOAPFault> fault; mCompletion->GetResponse(getter_AddRefs(mResponse)); if (mResponse) { rv = mResponse->GetFault(getter_AddRefs(fault)); if (NS_FAILED(rv)) { return rv; } } if (!mResponse || fault) { WSPException* exception = new WSPException(fault, mStatus); if (!exception) { return NS_ERROR_OUT_OF_MEMORY; } mException = exception; } nsCOMPtr<nsIInterfaceInfo> listenerInterfaceInfo; mProxy->GetListenerInterfaceInfo(getter_AddRefs(listenerInterfaceInfo)); NS_ASSERTION(listenerInterfaceInfo, "WSPCallContext:Missing listener interface info"); const nsXPTMethodInfo* methodInfo; rv = listenerInterfaceInfo->GetMethodInfo(mListenerMethodIndex, &methodInfo); if (NS_FAILED(rv)) { return rv; } PRUint32 paramCount = methodInfo->GetParamCount(); if(paramCount > PARAM_BUFFER_COUNT) { if(!(dispatchParams = new nsXPTCVariant[paramCount])) { return NS_ERROR_OUT_OF_MEMORY; } } else { dispatchParams = paramBuffer; } // iterate through the params to clear flags PRUint32 i; for(i = 0; i < paramCount; i++) { nsXPTCVariant* dp = &dispatchParams[i]; dp->ClearFlags(); dp->val.p = nsnull; } PRUint32 headerCount = 0, bodyCount = 0; nsISOAPHeaderBlock** headerBlocks; nsISOAPParameter** bodyBlocks; #define STRING_ARRAY_BUF_SIZE 2 nsAutoString string_array_buf[STRING_ARRAY_BUF_SIZE]; nsAutoString *string_array = &string_array_buf[0]; PRUint32 string_array_index = 0; // If we have an exception, report it now if (mException) { nsCOMPtr<nsISupports> canonical_this = do_QueryInterface(NS_STATIC_CAST(nsIWebServiceCallContext*, this)); dispatchParams[0].val.p = mException.get(); dispatchParams[0].SetValIsInterface(); dispatchParams[0].type.flags = XPT_TDP_POINTER | TD_INTERFACE_TYPE; dispatchParams[1].val.p = canonical_this; dispatchParams[1].SetValIsInterface(); dispatchParams[1].type.flags = XPT_TDP_POINTER | TD_INTERFACE_TYPE; rv = XPTC_InvokeByIndex(mAsyncListener, 3, 2, dispatchParams); } else if (mResponse) {
int x_main() { InvokeTestTarget *test = new InvokeTestTarget(); /* here we make the global 'check for alloc failure' checker happy */ if(!test) return 1; PRInt32 out, tmp32 = 0; PRInt64 out64; printf("calling direct:\n"); if(NS_SUCCEEDED(test->AddTwoInts(1,1,&out))) printf("\t1 + 1 = %d\n", out); else printf("\tFAILED"); PRInt64 one, two; LL_I2L(one, 1); LL_I2L(two, 2); if(NS_SUCCEEDED(test->AddTwoLLs(one,one,&out64))) { LL_L2I(tmp32, out64); printf("\t1L + 1L = %d\n", (int)tmp32); } else printf("\tFAILED"); if(NS_SUCCEEDED(test->MultTwoInts(2,2,&out))) printf("\t2 * 2 = %d\n", out); else printf("\tFAILED"); if(NS_SUCCEEDED(test->MultTwoLLs(two,two,&out64))) { LL_L2I(tmp32, out64); printf("\t2L * 2L = %d\n", (int)tmp32); } else printf("\tFAILED"); double outD; float outF; PRInt32 outI; char *outS; if(NS_SUCCEEDED(test->AddManyInts(1,2,3,4,5,6,7,8,9,10,&outI))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", outI); else printf("\tFAILED"); if(NS_SUCCEEDED(test->AddTwoFloats(1,2,&outF))) printf("\t1 + 2 = %ff\n", (double)outF); else printf("\tFAILED"); if(NS_SUCCEEDED(test->AddManyDoubles(1,2,3,4,5,6,7,8,9,10,&outD))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", outD); else printf("\tFAILED"); if(NS_SUCCEEDED(test->AddManyFloats(1,2,3,4,5,6,7,8,9,10,&outF))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", (double)outF); else printf("\tFAILED"); if(NS_SUCCEEDED(test->AddManyManyFloats(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,&outF))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 +1 15 + 16 + 17 + 18 + 19 + 20 = %ff\n", (double)outF); else printf("\tFAILED"); if(NS_SUCCEEDED(test->AddMixedInts(1,2,3,4,5,6,7,8,9,10,&out64))) { LL_L2I(tmp32, out64); printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", (int)tmp32); } else printf("\tFAILED"); if(NS_SUCCEEDED(test->AddMixedInts2(1,2,3,4,5,6,7,8,9,10,&out64))) { LL_L2I(tmp32, out64); printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", (int)tmp32); } else printf("\tFAILED"); if(NS_SUCCEEDED(test->AddMixedFloats(1,2,3,4,5,6,7,8,9,10,11,&outD))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", (double)outD); else printf("\tFAILED"); if (NS_SUCCEEDED(test->PassTwoStrings("", "moo","cow",&outS))) { printf(" = %s\n", outS); nsMemory::Free(outS); } else printf("\tFAILED"); printf("calling via invoke:\n"); nsXPTCVariant var[21]; var[0].val.i32 = 1; var[0].type = nsXPTType::T_I32; var[0].flags = 0; var[1].val.i32 = 1; var[1].type = nsXPTType::T_I32; var[1].flags = 0; var[2].val.i32 = 0; var[2].type = nsXPTType::T_I32; var[2].flags = nsXPTCVariant::PTR_IS_DATA; var[2].ptr = &var[2].val.i32; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 3, 3, var))) printf("\t1 + 1 = %d\n", var[2].val.i32); else printf("\tFAILED"); LL_I2L(var[0].val.i64, 1); var[0].type = nsXPTType::T_I64; var[0].flags = 0; LL_I2L(var[1].val.i64, 1); var[1].type = nsXPTType::T_I64; var[1].flags = 0; LL_I2L(var[2].val.i64, 0); var[2].type = nsXPTType::T_I64; var[2].flags = nsXPTCVariant::PTR_IS_DATA; var[2].ptr = &var[2].val.i64; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 5, 3, var))) printf("\t1L + 1L = %d\n", (int)var[2].val.i64); else printf("\tFAILED"); var[0].val.i32 = 2; var[0].type = nsXPTType::T_I32; var[0].flags = 0; var[1].val.i32 = 2; var[1].type = nsXPTType::T_I32; var[1].flags = 0; var[2].val.i32 = 0; var[2].type = nsXPTType::T_I32; var[2].flags = nsXPTCVariant::PTR_IS_DATA; var[2].ptr = &var[2].val.i32; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 4, 3, var))) printf("\t2 * 2 = %d\n", var[2].val.i32); else printf("\tFAILED"); LL_I2L(var[0].val.i64,2); var[0].type = nsXPTType::T_I64; var[0].flags = 0; LL_I2L(var[1].val.i64,2); var[1].type = nsXPTType::T_I64; var[1].flags = 0; LL_I2L(var[2].val.i64,0); var[2].type = nsXPTType::T_I64; var[2].flags = nsXPTCVariant::PTR_IS_DATA; var[2].ptr = &var[2].val.i64; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 6, 3, var))) printf("\t2L * 2L = %d\n", (int)var[2].val.i64); else printf("\tFAILED"); var[0].val.i32 = 1; var[0].type = nsXPTType::T_I32; var[0].flags = 0; var[1].val.i32 = 2; var[1].type = nsXPTType::T_I32; var[1].flags = 0; var[2].val.i32 = 3; var[2].type = nsXPTType::T_I32; var[2].flags = 0; var[3].val.i32 = 4; var[3].type = nsXPTType::T_I32; var[3].flags = 0; var[4].val.i32 = 5; var[4].type = nsXPTType::T_I32; var[4].flags = 0; var[5].val.i32 = 6; var[5].type = nsXPTType::T_I32; var[5].flags = 0; var[6].val.i32 = 7; var[6].type = nsXPTType::T_I32; var[6].flags = 0; var[7].val.i32 = 8; var[7].type = nsXPTType::T_I32; var[7].flags = 0; var[8].val.i32 = 9; var[8].type = nsXPTType::T_I32; var[8].flags = 0; var[9].val.i32 = 10; var[9].type = nsXPTType::T_I32; var[9].flags = 0; var[10].val.i32 = 0; var[10].type = nsXPTType::T_I32; var[10].flags = nsXPTCVariant::PTR_IS_DATA; var[10].ptr = &var[10].val.i32; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 7, 11, var))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", var[10].val.i32); var[0].val.f = 1.0f; var[0].type = nsXPTType::T_FLOAT; var[0].flags = 0; var[1].val.f = 2.0f; var[1].type = nsXPTType::T_FLOAT; var[1].flags = 0; var[2].val.f = 0.0f; var[2].type = nsXPTType::T_FLOAT; var[2].flags = nsXPTCVariant::PTR_IS_DATA; var[2].ptr = &var[2].val.f; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 8, 3, var))) printf("\t1 + 2 = %ff\n", (double) var[2].val.f); var[0].val.d = 1.0; var[0].type = nsXPTType::T_DOUBLE; var[0].flags = 0; var[1].val.d = 2.0; var[1].type = nsXPTType::T_DOUBLE; var[1].flags = 0; var[2].val.d = 3.0; var[2].type = nsXPTType::T_DOUBLE; var[2].flags = 0; var[3].val.d = 4.0; var[3].type = nsXPTType::T_DOUBLE; var[3].flags = 0; var[4].val.d = 5.0; var[4].type = nsXPTType::T_DOUBLE; var[4].flags = 0; var[5].val.d = 6.0; var[5].type = nsXPTType::T_DOUBLE; var[5].flags = 0; var[6].val.d = 7.0; var[6].type = nsXPTType::T_DOUBLE; var[6].flags = 0; var[7].val.d = 8.0; var[7].type = nsXPTType::T_DOUBLE; var[7].flags = 0; var[8].val.d = 9.0; var[8].type = nsXPTType::T_DOUBLE; var[8].flags = 0; var[9].val.d = 10.0; var[9].type = nsXPTType::T_DOUBLE; var[9].flags = 0; var[10].val.d = 0.0; var[10].type = nsXPTType::T_DOUBLE; var[10].flags = nsXPTCVariant::PTR_IS_DATA; var[10].ptr = &var[10].val.d; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 9, 11, var))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", var[10].val.d); else printf("\tFAILED"); var[0].val.f = 1.0f; var[0].type = nsXPTType::T_FLOAT; var[0].flags = 0; var[1].val.f = 2.0f; var[1].type = nsXPTType::T_FLOAT; var[1].flags = 0; var[2].val.f = 3.0f; var[2].type = nsXPTType::T_FLOAT; var[2].flags = 0; var[3].val.f = 4.0f; var[3].type = nsXPTType::T_FLOAT; var[3].flags = 0; var[4].val.f = 5.0f; var[4].type = nsXPTType::T_FLOAT; var[4].flags = 0; var[5].val.f = 6.0f; var[5].type = nsXPTType::T_FLOAT; var[5].flags = 0; var[6].val.f = 7.0f; var[6].type = nsXPTType::T_FLOAT; var[6].flags = 0; var[7].val.f = 8.0f; var[7].type = nsXPTType::T_FLOAT; var[7].flags = 0; var[8].val.f = 9.0f; var[8].type = nsXPTType::T_FLOAT; var[8].flags = 0; var[9].val.f = 10.0f; var[9].type = nsXPTType::T_FLOAT; var[9].flags = 0; var[10].val.f = 0.0f; var[10].type = nsXPTType::T_FLOAT; var[10].flags = nsXPTCVariant::PTR_IS_DATA; var[10].ptr = &var[10].val.f; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 10, 11, var))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", (double) var[10].val.f); else printf("\tFAILED"); var[0].val.f = 1.0f; var[0].type = nsXPTType::T_FLOAT; var[0].flags = 0; var[1].val.f = 2.0f; var[1].type = nsXPTType::T_FLOAT; var[1].flags = 0; var[2].val.f = 3.0f; var[2].type = nsXPTType::T_FLOAT; var[2].flags = 0; var[3].val.f = 4.0f; var[3].type = nsXPTType::T_FLOAT; var[3].flags = 0; var[4].val.f = 5.0f; var[4].type = nsXPTType::T_FLOAT; var[4].flags = 0; var[5].val.f = 6.0f; var[5].type = nsXPTType::T_FLOAT; var[5].flags = 0; var[6].val.f = 7.0f; var[6].type = nsXPTType::T_FLOAT; var[6].flags = 0; var[7].val.f = 8.0f; var[7].type = nsXPTType::T_FLOAT; var[7].flags = 0; var[8].val.f = 9.0f; var[8].type = nsXPTType::T_FLOAT; var[8].flags = 0; var[9].val.f = 10.0f; var[9].type = nsXPTType::T_FLOAT; var[9].flags = 0; var[10].val.f = 11.0f; var[10].type = nsXPTType::T_FLOAT; var[10].flags = 0; var[11].val.f = 12.0f; var[11].type = nsXPTType::T_FLOAT; var[11].flags = 0; var[12].val.f = 13.0f; var[12].type = nsXPTType::T_FLOAT; var[12].flags = 0; var[13].val.f = 14.0f; var[13].type = nsXPTType::T_FLOAT; var[13].flags = 0; var[14].val.f = 15.0f; var[14].type = nsXPTType::T_FLOAT; var[14].flags = 0; var[15].val.f = 16.0f; var[15].type = nsXPTType::T_FLOAT; var[15].flags = 0; var[16].val.f = 17.0f; var[16].type = nsXPTType::T_FLOAT; var[16].flags = 0; var[17].val.f = 18.0f; var[17].type = nsXPTType::T_FLOAT; var[17].flags = 0; var[18].val.f = 19.0f; var[18].type = nsXPTType::T_FLOAT; var[18].flags = 0; var[19].val.f = 20.0f; var[19].type = nsXPTType::T_FLOAT; var[19].flags = 0; var[20].val.f = 0.0f; var[20].type = nsXPTType::T_FLOAT; var[20].flags = nsXPTCVariant::PTR_IS_DATA; var[20].ptr = &var[20].val.f; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 11, 21, var))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 = %ff\n", (double) var[20].val.f); var[0].val.i64 = 1; var[0].type = nsXPTType::T_I64; var[0].flags = 0; var[1].val.i32 = 2; var[1].type = nsXPTType::T_I32; var[1].flags = 0; var[2].val.i64 = 3; var[2].type = nsXPTType::T_I64; var[2].flags = 0; var[3].val.i32 = 4; var[3].type = nsXPTType::T_I32; var[3].flags = 0; var[4].val.i32 = 5; var[4].type = nsXPTType::T_I32; var[4].flags = 0; var[5].val.i64 = 6; var[5].type = nsXPTType::T_I64; var[5].flags = 0; var[6].val.i32 = 7; var[6].type = nsXPTType::T_I32; var[6].flags = 0; var[7].val.i32 = 8; var[7].type = nsXPTType::T_I32; var[7].flags = 0; var[8].val.i64 = 9; var[8].type = nsXPTType::T_I64; var[8].flags = 0; var[9].val.i32 = 10; var[9].type = nsXPTType::T_I32; var[9].flags = 0; var[10].val.i64 = 0; var[10].type = nsXPTType::T_I64; var[10].flags = nsXPTCVariant::PTR_IS_DATA; var[10].ptr = &var[10].val.i64; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 12, 11, var))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", (int)var[10].val.i64); else printf("\tFAILED"); var[0].val.i32 = 1; var[0].type = nsXPTType::T_I32; var[0].flags = 0; var[1].val.i64 = 2; var[1].type = nsXPTType::T_I64; var[1].flags = 0; var[2].val.i32 = 3; var[2].type = nsXPTType::T_I32; var[2].flags = 0; var[3].val.i64 = 4; var[3].type = nsXPTType::T_I64; var[3].flags = 0; var[4].val.i64 = 5; var[4].type = nsXPTType::T_I64; var[4].flags = 0; var[5].val.i32 = 6; var[5].type = nsXPTType::T_I32; var[5].flags = 0; var[6].val.i64 = 7; var[6].type = nsXPTType::T_I64; var[6].flags = 0; var[7].val.i64 = 8; var[7].type = nsXPTType::T_I64; var[7].flags = 0; var[8].val.i32 = 9; var[8].type = nsXPTType::T_I32; var[8].flags = 0; var[9].val.i64 = 10; var[9].type = nsXPTType::T_I64; var[9].flags = 0; var[10].val.i64 = 0; var[10].type = nsXPTType::T_I64; var[10].flags = nsXPTCVariant::PTR_IS_DATA; var[10].ptr = &var[10].val.i64; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 13, 11, var))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", (int)var[10].val.i64); else printf("\tFAILED"); var[0].val.f = 1.0f; var[0].type = nsXPTType::T_FLOAT; var[0].flags = 0; var[1].val.f = 2.0f; var[1].type = nsXPTType::T_FLOAT; var[1].flags = 0; var[2].val.d = 3.0; var[2].type = nsXPTType::T_DOUBLE; var[2].flags = 0; var[3].val.d = 4.0; var[3].type = nsXPTType::T_DOUBLE; var[3].flags = 0; var[4].val.f = 5.0f; var[4].type = nsXPTType::T_FLOAT; var[4].flags = 0; var[5].val.f = 6.0f; var[5].type = nsXPTType::T_FLOAT; var[5].flags = 0; var[6].val.d = 7.0; var[6].type = nsXPTType::T_DOUBLE; var[6].flags = 0; var[7].val.d = 8.0; var[7].type = nsXPTType::T_DOUBLE; var[7].flags = 0; var[8].val.f = 9.0f; var[8].type = nsXPTType::T_FLOAT; var[8].flags = 0; var[9].val.d = 10.0; var[9].type = nsXPTType::T_DOUBLE; var[9].flags = 0; var[10].val.f = 11.0f; var[10].type = nsXPTType::T_FLOAT; var[10].flags = 0; var[11].val.d = 0.0; var[11].type = nsXPTType::T_DOUBLE; var[11].flags = nsXPTCVariant::PTR_IS_DATA; var[11].ptr = &var[11].val.d; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 14, 12, var))) printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", var[11].val.d); else printf("\tFAILED"); var[0].val.p = (void*)""; var[0].type = nsXPTType::T_CHAR_STR; var[0].flags = 0; var[1].val.p = (void*)"moo"; var[1].type = nsXPTType::T_CHAR_STR; var[1].flags = 0; var[2].val.p = (void*)"cow"; var[2].type = nsXPTType::T_CHAR_STR; var[2].flags = 0; var[3].val.p = 0; var[3].type = nsXPTType::T_CHAR_STR; var[3].flags = nsXPTCVariant::PTR_IS_DATA; var[3].ptr = &var[2].val.p; if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 15, 4, var))) printf(" = %s\n", var[2].val.p); else printf("\tFAILED"); DoMultipleInheritenceTest(); DoMultipleInheritenceTest2(); // Disabled by default - takes too much time on slow machines //DoSpeedTest(); return 0; }