callTransfer.cpp
上传用户:hnnddl
上传日期:2007-01-06
资源大小:3580k
文件大小:12k
源码类别:

IP电话/视频会议

开发平台:

WINDOWS

  1. /*
  2.  * $Revision: 1.2 $
  3.  * $Date: 1998/11/03 18:32:02 $
  4.  */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include "exchange.h"
  9. #include "h450msgs.h"
  10. /////////////////////////////////////////////////////////////
  11. //
  12. // ctInitiateInvoke()
  13. //
  14. // Inputs:
  15. // invokeID - must be zero until OSS updated
  16. //   to fix bug.
  17. // callid - string upto 4 chars + NULL
  18. // ip - string with transfer-to ip address
  19. // e164 (opt) - will add if not NULL
  20. //
  21. // Output:
  22. // A pointer to a single H4501SuppService
  23. // object for which memory is allocated.
  24. //
  25. // CALLING FUNCTION MUST DELETE RETURD OBJECT.
  26. //
  27. /////////////////////////////////////////////////////////////
  28. H4501SuppService *
  29. ctInitiateInvoke(int invokeID, char *callid, unsigned int ip, char *e164)
  30. {
  31. ProtReturnCode ret;
  32. int len;
  33. int local;
  34. H4501SuppService *ss;
  35. H450AliasAddress *firstAA;
  36. H450AliasAddress *secondAA;
  37. H4501EndpointAddr *ep;
  38. H4502CTInitiateArg *initarg;
  39. H4501Invoke *inv;
  40. H4501Code *code;
  41. ss = new H4501SuppService;
  42. firstAA = new H450AliasAddress;
  43. secondAA = new H450AliasAddress;
  44. ep = new H4501EndpointAddr;
  45. initarg = new H4502CTInitiateArg;
  46. inv = new H4501Invoke;
  47. code = new H4501Code;
  48. LOG("nctInitiateInvoke()n");
  49. if(ip != 0) {
  50. sockaddr_in addr;
  51. addr.sin_family = AF_INET;
  52. addr.sin_port = htons(1720);
  53. addr.sin_addr.s_addr = ip;
  54. LOG("  firstAA->SetTransportID() to set address to: ip=0x%xn", ip);
  55. ret = firstAA->SetTransportID((sockaddr *)&addr);
  56. if (!PROT_IS_SUCCESS(ret))  {
  57. doError(ret,EXIT_ON_ERROR);
  58. }
  59. LOG("  ep->AddDestAddr(*firstAA) to add first AliasAddress to EndpointAddressn");
  60. ret = ep->AddDestAddr(*firstAA);
  61. if (!PROT_IS_SUCCESS(ret))  {
  62. doError(ret,EXIT_ON_ERROR);
  63. }
  64. }
  65. if(e164 != NULL) {
  66. len = strlen(e164);
  67. LOG("  secondAA->SetE164() to set address to: %s len=%dn", e164,len);
  68. ret = secondAA->SetE164(e164, len);
  69. if (!PROT_IS_SUCCESS(ret))  {
  70. doError(ret,EXIT_ON_ERROR);
  71. }
  72. LOG("  ep->AddDestAddr(*secondAA) to add second AliasAddressn");
  73. ret = ep->AddDestAddr(*secondAA);
  74. if (!PROT_IS_SUCCESS(ret))  {
  75. doError(ret,EXIT_ON_ERROR);
  76. }
  77. }
  78. // callIdentity is mandatory
  79. len = strlen(callid);
  80. LOG("  initarg->SetCallID() to set callIdentity of InitiateArg, callid = %s len=%dn", callid, len);
  81. ret = initarg->SetCallID(callid,len);
  82. if (!PROT_IS_SUCCESS(ret))  {
  83. doError(ret,EXIT_ON_ERROR);
  84. }
  85. LOG("  initarg->SetNumber(*ep) to set reroutingNumber of InitiateArg  n");
  86. ret = initarg->SetNumber(*ep);
  87. if (!PROT_IS_SUCCESS(ret))  {
  88. doError(ret,EXIT_ON_ERROR);
  89. }
  90. local = CTOT_INITIATE;
  91. LOG("  code->SetLocalCode() to set code to local:%d n",local);
  92. ret = code->SetLocalCode(local);
  93. if (!PROT_IS_SUCCESS(ret))  {
  94. doError(ret,EXIT_ON_ERROR);
  95. }
  96. invokeID = 0;
  97. LOG("  inv->SetInvokeId(%d) to set InvokeId of Invoke n",invokeID);
  98. ret = inv->SetInvokeId(invokeID);
  99. if (!PROT_IS_SUCCESS(ret))  {
  100. doError(ret,EXIT_ON_ERROR);
  101. }
  102. LOG("  inv->SetCode(*code) to set opcode of Invoke n");
  103. ret = inv->SetCode(*code);
  104. if (!PROT_IS_SUCCESS(ret))  {
  105. doError(ret,EXIT_ON_ERROR);
  106. }
  107. LOG("  inv->SetArgument(*initarg) to set argument of Invoke n");
  108. ret = inv->SetArgument(*initarg);
  109. if (!PROT_IS_SUCCESS(ret))  {
  110. doError(ret,EXIT_ON_ERROR);
  111. }
  112. LOG("  SuppService->AddROS(*inv) to add the Invoken");
  113. ret = ss->AddROS(*inv);
  114. if (!PROT_IS_SUCCESS(ret))  {
  115. doError(ret,EXIT_ON_ERROR);
  116. }
  117. delete firstAA;
  118. delete secondAA;
  119. delete ep;
  120. delete initarg;
  121. delete inv;
  122. delete code;
  123. return (ss);
  124. }
  125. /////////////////////////////////////////////////////////////
  126. //
  127. // ctSetupInvoke()
  128. //
  129. // Inputs:
  130. // invokeID - must be zero until OSS updated
  131. //   to fix bug.
  132. // callid - string upto 4 chars + NULL
  133. //
  134. // Output:
  135. // A pointer to a single H4501SuppService
  136. // object for which memory is allocated.
  137. //
  138. // CALLING FUNCTION MUST DELETE RETURD OBJECT.
  139. //
  140. /////////////////////////////////////////////////////////////
  141. H4501SuppService *
  142. ctSetupInvoke(int invokeID, char *callid)
  143. {
  144. ProtReturnCode ret;
  145. int len;
  146. int local;
  147. H4501SuppService *ss;
  148. H4502CTSetupArg *setuparg;
  149. H4501Invoke *inv;
  150. H4501Code *code;
  151. LOG("nctSetupInvoke(): enteredn");
  152. ss = new H4501SuppService;
  153. inv = new H4501Invoke;
  154. code = new H4501Code;
  155. setuparg = new H4502CTSetupArg;
  156. LOG("inv->SetInvokeId(%d)n",invokeID); // ???? ONLY ACCEPTS 0 FOR NOW
  157. ret = inv->SetInvokeId(invokeID);
  158. if (!PROT_IS_SUCCESS(ret))  {
  159. doError(ret,EXIT_ON_ERROR);
  160. }
  161. local = CTOT_SETUP;
  162. LOG("code->SetLocalCode(%d)  n",local);
  163. ret = code->SetLocalCode(local);
  164. if (!PROT_IS_SUCCESS(ret))  {
  165. doError(ret,EXIT_ON_ERROR);
  166. }
  167. LOG("inv->SetCode(*code) n");
  168. ret = inv->SetCode(*code);
  169. if (!PROT_IS_SUCCESS(ret))  {
  170. doError(ret,EXIT_ON_ERROR);
  171. }
  172. len = strlen(callid);
  173. LOG("setuparg->SetCallID("%s",%d)n",callid,len);
  174. ret = setuparg->SetCallID(callid,len);
  175. if (!PROT_IS_SUCCESS(ret))  {
  176. doError(ret,EXIT_ON_ERROR);
  177. }
  178. LOG("inv->SetArgument(*setuparg) n");
  179. ret = inv->SetArgument(*setuparg);
  180. if (!PROT_IS_SUCCESS(ret))  {
  181. doError(ret,EXIT_ON_ERROR);
  182. }
  183. LOG("ss->AddROS(*inv)n");
  184. ret = ss->AddROS(*inv);
  185. if (!PROT_IS_SUCCESS(ret))  {
  186. doError(ret,EXIT_ON_ERROR);
  187. }
  188. delete inv;
  189. delete code;
  190. delete setuparg;
  191. return(ss);
  192. }
  193. /////////////////////////////////////////////////////////////
  194. //
  195. // ctSetupReturnResult()
  196. //
  197. // Inputs:
  198. // invokeID - invokeID from received message
  199. //
  200. // Output:
  201. // A pointer to a single H4501SuppService
  202. // object for which memory is allocated.
  203. //
  204. // CALLING FUNCTION MUST DELETE RETURD OBJECT.
  205. //
  206. /////////////////////////////////////////////////////////////
  207. H4501SuppService *
  208. ctSetupReturnResult(int invokeID)
  209. {
  210. ProtReturnCode ret;
  211. int len;
  212. int local;
  213. H4501SuppService *ss;
  214. H4501ReturnResult *res;
  215. H450NonStdParam *param;
  216. H4502DummyRes *dum;
  217. H4501Code *code;
  218. ss = new H4501SuppService;
  219. res = new H4501ReturnResult;
  220. param = new H450NonStdParam;
  221. dum = new H4502DummyRes;
  222. code = new H4501Code;
  223. LOG("ctSetupReturnResult: enteredn");
  224. LOG("  res->SetInvokeId(%d) on ReturnResult n",invokeID);
  225. ret = res->SetInvokeId(invokeID);
  226. if (!PROT_IS_SUCCESS(ret))  {
  227. doError(ret,EXIT_ON_ERROR);
  228. }
  229. local = CTOT_SETUP;
  230. LOG("  code->SetLocalCode() to set to local:%d n",local);
  231. ret = code->SetLocalCode(local);
  232. if (!PROT_IS_SUCCESS(ret))  {
  233. doError(ret,EXIT_ON_ERROR);
  234. }
  235. // This seems weird but in order to set the code in the result we
  236. // need to have either and Extension or NonStdData in DummyRes
  237. // so let's put NonStdData since it is easier to use for some junk
  238. unsigned short cc = 12;
  239. unsigned short ext = 34;
  240. unsigned short mc = 56;
  241. LOG("  param->SetH221NonStd(%d,%d,%d) to set NonStandardIdentifier n",cc,ext,mc);
  242. ret = param->SetH221NonStd(cc,ext,mc);
  243. if (!PROT_IS_SUCCESS(ret))  {
  244. doError(ret,EXIT_ON_ERROR);
  245. }
  246. unsigned char data[7] = {0x61,0x62,0x63,0x64,0x65,0x66,0x67};
  247. len = 7;
  248. LOG("  param->SetNonStdData() to set Data field of NonStandardParameter data=%s len=%dn",(char *)data,len);
  249. ret = param->SetNonStdData(data,len);
  250. if (!PROT_IS_SUCCESS(ret))  {
  251. doError(ret,EXIT_ON_ERROR);
  252. }
  253. LOG("  dum->SetNonStdData(*param) to load DummyRes with NonStandardDatan");
  254. ret = dum->SetNonStdData(*param);
  255. if (!PROT_IS_SUCCESS(ret))  {
  256. doError(ret,EXIT_ON_ERROR);
  257. }
  258. LOG("  res->SetResult(*code, *dum) to set Emresult field  n");
  259. ret = res->SetResult(*code, *dum);
  260. if (!PROT_IS_SUCCESS(ret))  {
  261. doError(ret,EXIT_ON_ERROR);
  262. }
  263. LOG("  ss->AddROS(*res) to add the ReturnResultn");
  264. ret = ss->AddROS(*res);
  265. if (!PROT_IS_SUCCESS(ret))  {
  266. doError(ret,EXIT_ON_ERROR);
  267. }
  268. delete res;
  269. delete param;
  270. delete dum;
  271. delete code;
  272. return(ss);
  273. }
  274. /////////////////////////////////////////////////////////////
  275. //
  276. // ctInitiateReturnResult()
  277. //
  278. // Inputs:
  279. // invokeID - invokeID from received message
  280. //
  281. // Output:
  282. // A pointer to a single H4501SuppService
  283. // object for which memory is allocated.
  284. //
  285. // CALLING FUNCTION MUST DELETE RETURD OBJECT.
  286. //
  287. /////////////////////////////////////////////////////////////
  288. H4501SuppService *
  289. ctInitiateReturnResult(int invokeID)
  290. {
  291. ProtReturnCode ret;
  292. int len;
  293. int local;
  294. H4501SuppService *ss;
  295. H4501ReturnResult *res;
  296. H450NonStdParam *param;
  297. H4502DummyRes *dum;
  298. H4501Code *code;
  299. ss = new H4501SuppService;
  300. res = new H4501ReturnResult;
  301. param = new H450NonStdParam;
  302. dum = new H4502DummyRes;
  303. code = new H4501Code;
  304. LOG("ctInitiateReturnResult: enteredn");
  305. LOG("  res->SetInvokeId(%d) on ReturnResult n",invokeID);
  306. ret = res->SetInvokeId(invokeID);
  307. if (!PROT_IS_SUCCESS(ret))  {
  308. doError(ret,EXIT_ON_ERROR);
  309. }
  310. local = CTOT_INITIATE;
  311. LOG("  code->SetLocalCode() to set to local:%d n",local);
  312. ret = code->SetLocalCode(local);
  313. if (!PROT_IS_SUCCESS(ret))  {
  314. doError(ret,EXIT_ON_ERROR);
  315. }
  316. // This seems weird but in order to set the code in the result we
  317. // need to have either and Extension or NonStdData in DummyRes
  318. // so let's put NonStdData since it is easier to use for some junk
  319. unsigned short cc = 88;
  320. unsigned short ext = 77;
  321. unsigned short mc = 66;
  322. LOG("  param->SetH221NonStd(%d,%d,%d) to set NonStandardIdentifier n",cc,ext,mc);
  323. ret = param->SetH221NonStd(cc,ext,mc);
  324. if (!PROT_IS_SUCCESS(ret))  {
  325. doError(ret,EXIT_ON_ERROR);
  326. }
  327. unsigned char data[7] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37};
  328. len = 7;
  329. LOG("  param->SetNonStdData() to set Data field of NonStandardParameter data=%s len=%dn",(char *)data,len);
  330. ret = param->SetNonStdData(data,len);
  331. if (!PROT_IS_SUCCESS(ret))  {
  332. doError(ret,EXIT_ON_ERROR);
  333. }
  334. LOG("  dum->SetNonStdData(*param) to load DummyRes with NonStandardDatan");
  335. ret = dum->SetNonStdData(*param);
  336. if (!PROT_IS_SUCCESS(ret))  {
  337. doError(ret,EXIT_ON_ERROR);
  338. }
  339. LOG("  res->SetResult(*code, *dum) to set Emresult field  n");
  340. ret = res->SetResult(*code, *dum);
  341. if (!PROT_IS_SUCCESS(ret))  {
  342. doError(ret,EXIT_ON_ERROR);
  343. }
  344. LOG("  ss->AddROS(*res) to add the ReturnResultn");
  345. ret = ss->AddROS(*res);
  346. if (!PROT_IS_SUCCESS(ret))  {
  347. doError(ret,EXIT_ON_ERROR);
  348. }
  349. delete res;
  350. delete param;
  351. delete dum;
  352. delete code;
  353. return(ss);
  354. }
  355. int
  356. isInitiateInvoke(H4501SuppService *ss, int &invokeID, char *call_id,
  357. unsigned int &ip_addr, char *phone)
  358. {
  359. ProtReturnCode ret;
  360. extractedSS extSS;
  361. extSS.tH4501SuppService(ss);
  362. if (extSS.ssNumROSs > 0)
  363. {
  364. LOG("ssNumROSs=%d type=%d code=%dn",extSS.ssNumROSs,extSS.ssROS[0].type,extSS.ssROS[0].code);
  365. if (extSS.ssROS[0].type == ROS_INVOKE)
  366. {
  367. if (extSS.ssROS[0].code == CTOT_INITIATE) 
  368. {
  369. LOG("initiate.invoke receivedn");
  370. invokeID = extSS.ssROS[0].InvokeId;
  371. strncpy(call_id, extSS.ssROS[0].Arg.CallID, 5);
  372. H4501EndpointAddr *ep = extSS.ssROS[0].Arg.EndpointAddr;
  373. H450AliasAddress *pAA;
  374. int count;
  375. int len;
  376. int type;
  377. ret = ep->GetNumDestAddrs(count);
  378. if (!PROT_IS_SUCCESS(ret))  {
  379. doError(ret,EXIT_ON_ERROR);
  380. }
  381. if(count == 0) {
  382. LOG("ERROR: No Dst addrs in initiate.invn");
  383. return(-1);
  384. }
  385. pAA = new H450AliasAddress[count];
  386. ret = ep->GetDestAddrs(pAA, count);
  387. if (!PROT_IS_SUCCESS(ret))  {
  388. doError(ret,EXIT_ON_ERROR);
  389. }
  390. for(int ia = 0; ia < count; ia++) {
  391. type = pAA[ia].GetType();
  392. switch(type) {
  393. case AAT_INVALID:
  394. LOG("test_extractedSS: AliasAddress type is AAT_INVALIDn");
  395. break;
  396. case AAT_E164:
  397. {
  398. char *e164;
  399. ret = pAA[ia].GetE164(e164, len);
  400. if (!PROT_IS_SUCCESS(ret)) {
  401. doError(ret,EXIT_ON_ERROR);
  402. } else {
  403. char retstr[MAXOUTSTR];
  404. LOG(" GetE164() e164 = %sn",
  405. sprint_string((unsigned char *)e164,
  406. MAXSTRLEN(len), retstr));
  407. LOG(" len = %dn",len);
  408. strncpy (phone, e164, len);
  409. phone[len] = '';
  410. }
  411. break;
  412. }
  413. case AAT_TRANSPORT_ID:
  414. {
  415.  struct sockaddr_in addr;
  416. ret = pAA[ia].GetTransportID((sockaddr *)&addr);
  417. if (!PROT_IS_SUCCESS(ret)) {
  418. doError(ret,EXIT_ON_ERROR);
  419. } else {
  420. char sockstr[25];
  421. LOG("%sGetTransportID() transportID = %sn",
  422. sprint_sockaddr((sockaddr *)&addr,sockstr));
  423. ip_addr = addr.sin_addr.s_addr;
  424. }
  425. break;
  426. }
  427. default:
  428. LOG("AliasAddr type being ignored %dn",type);
  429. break;
  430. }
  431. }
  432. delete [] pAA;
  433. // LOG("Placing a call to transferredTon");
  434. // exchange->PlaceTransferedToCall(myindex, ip_addr, 
  435. // phone, transfer_invoke_id, transfer_call_id);
  436. }
  437. else
  438. {
  439. return(0);
  440. }
  441. }
  442. else
  443. {
  444. return(0);
  445. }
  446. }
  447. else
  448. {
  449. return(0);
  450. }
  451. return(1);
  452. }