1 mike 1.1 /*
2 **==============================================================================
3 **
4 ** Open Management Infrastructure (OMI)
5 **
6 ** Copyright (c) Microsoft Corporation
7 **
8 ** Licensed under the Apache License, Version 2.0 (the "License"); you may not
9 ** use this file except in compliance with the License. You may obtain a copy
10 ** of the License at
11 **
12 ** http://www.apache.org/licenses/LICENSE-2.0
13 **
14 ** THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 ** KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
16 ** WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
17 ** MERCHANTABLITY OR NON-INFRINGEMENT.
18 **
19 ** See the Apache 2 License for the specific language governing permissions
20 ** and limitations under the License.
21 **
22 mike 1.1 **==============================================================================
23 */
24
25 #include "client.h"
26 #include <base/packing.h>
27 #include <protocol/protocol.h>
|
28 krisbash 1.3 #include <pal/sleep.h>
|
29 mike 1.1 #include <base/paths.h>
|
30 krisbash 1.3 #include <pal/thread.h>
31 #include <base/log.h>
|
32 mike 1.1
33 #if 0
34 # define D(X) X
35 #else
36 # define D(X) /* empty */
37 #endif
38
|
39 krisbash 1.3 STRAND_DEBUGNAME(OmiClient);
40
|
41 mike 1.1 MI_BEGIN_NAMESPACE
42
43 //==============================================================================
44 //
45 // Local definitions.
46 //
47 //==============================================================================
48
|
49 krisbash 1.3 PAL_Uint64 _NextOperationId()
|
50 mike 1.1 {
|
51 krisbash 1.3 static volatile ptrdiff_t _operationId = 10000;
52 PAL_Uint64 x = Atomic_Inc(&_operationId);
|
53 mike 1.1
54 return x;
55 }
56
57 static char* _StringToStr(const String& str)
58 {
59 Uint32 n = str.GetSize();
60 char* r = new char[n + 1];
61
62 if (!r)
63 return NULL;
64
65 for (Uint32 i = 0; i < n; i++)
66 {
67 r[i] = char(str[i]);
68 }
69
70 r[n] = '\0';
71
72 return r;
73 }
74 mike 1.1
|
75 krisbash 1.3 static String _StrToString(const char* str)
76 {
77 String r;
78
79 while (str)
80 {
81 MI_Char c = *str++;
82 r.Append(&c, 1);
83 }
84
85 return r;
86 }
87
|
88 mike 1.1 //==============================================================================
89 //
90 // class EnvelopeHandler
91 //
92 //==============================================================================
93
94 class EnvelopeHandler : public Handler
95 {
96 public:
97
98 EnvelopeHandler(Handler* handler) : m_handler(handler)
99 {
100 }
101
102 virtual void HandleConnect()
103 {
104 if (m_handler)
105 m_handler->HandleConnect();
106 }
107
108 virtual void HandleConnectFailed()
109 mike 1.1 {
110 if (m_handler)
111 m_handler->HandleConnectFailed();
112 }
113
114 virtual void HandleDisconnect()
115 {
116 if (m_handler)
117 m_handler->HandleDisconnect();
118 }
119
|
120 krisbash 1.3 virtual void HandleNoOp(Uint64 operationId)
|
121 mike 1.1 {
122 if (m_handler)
|
123 krisbash 1.3 m_handler->HandleNoOp(operationId);
|
124 mike 1.1 }
125
|
126 krisbash 1.3 virtual void HandleInstance(Uint64 operationId, const DInstance& instance)
|
127 mike 1.1 {
128 if (m_handler)
|
129 krisbash 1.3 m_handler->HandleInstance(operationId, instance);
|
130 mike 1.1 }
131
|
132 krisbash 1.3 virtual void HandleResult(Uint64 operationId, MI_Result result)
|
133 mike 1.1 {
134 if (m_handler)
|
135 krisbash 1.3 m_handler->HandleResult(operationId, result);
136 }
137 virtual void HandleResult(Uint64 operationId, MI_Result result, const MI_Char *error, const DInstance* cimError)
138 {
139 if (m_handler)
140 m_handler->HandleResult(operationId, result, error, cimError);
|
141 mike 1.1 }
142
143 private:
144 Handler* m_handler;
145 };
146
147 //==============================================================================
148 //
149 // class NoOpHandler
150 //
151 //==============================================================================
152
153 class NoOpHandler : public EnvelopeHandler
154 {
155 public:
156
157 enum State { START, DONE, FAILED };
158
|
159 krisbash 1.3 NoOpHandler(Handler* handler, Uint64 operationId) :
160 EnvelopeHandler(handler), m_state(START), m_operationId(operationId)
|
161 mike 1.1 {
162 }
163
|
164 krisbash 1.3 virtual void HandleNoOp(Uint64 operationId)
|
165 mike 1.1 {
|
166 krisbash 1.3 if (operationId != m_operationId)
|
167 mike 1.1 {
|
168 krisbash 1.3 EnvelopeHandler::HandleNoOp(operationId);
|
169 mike 1.1 return;
170 }
171
172 if (m_state != START)
173 {
174 m_state = FAILED;
175 return;
176 }
177
178 m_state = DONE;
179 }
180
181 State m_state;
|
182 krisbash 1.3 Uint64 m_operationId;
|
183 mike 1.1 };
184
185 //==============================================================================
186 //
187 // class ResultHandler
188 //
189 //==============================================================================
190
191 class ResultHandler : public EnvelopeHandler
192 {
193 public:
194
195 enum State { START, DONE, FAILED };
196
|
197 krisbash 1.3 ResultHandler(Handler* handler, Uint64 operationId) :
|
198 mike 1.1 EnvelopeHandler(handler),
199 m_state(START),
|
200 krisbash 1.3 m_operationId(operationId),
201 m_result(MI_RESULT_OK),
202 m_cimerror(NULL),
203 m_errorMessage(NULL)
|
204 mike 1.1 {
205 }
206
|
207 krisbash 1.3 virtual void HandleResult(Uint64 operationId, Result result)
|
208 mike 1.1 {
|
209 krisbash 1.3 if (operationId != m_operationId)
|
210 mike 1.1 {
|
211 krisbash 1.3 EnvelopeHandler::HandleResult(operationId, result);
|
212 mike 1.1 return;
213 }
214
215 if (m_state != START)
216 {
217 m_state = FAILED;
218 return;
219 }
220
221 m_result = result;
222 m_state = DONE;
223 }
224
|
225 krisbash 1.3 virtual void HandleResult(Uint64 operationId, MI_Result result, const MI_Char *error, const DInstance* cimError)
226 {
227 if (operationId != m_operationId)
228 {
229 EnvelopeHandler::HandleResult(operationId, result, error, cimError);
230 return;
231 }
232
233 if (m_state != START)
234 {
235 m_state = FAILED;
236 return;
237 }
238
239 m_result = result;
240 m_cimerror = cimError;
241 m_errorMessage = error;
242 m_state = DONE;
243 }
244
|
245 mike 1.1 State m_state;
|
246 krisbash 1.3 Uint64 m_operationId;
|
247 mike 1.1 Result m_result;
|
248 krisbash 1.3 const DInstance* m_cimerror;
249 const MI_Char *m_errorMessage;
|
250 mike 1.1 };
251
252 //==============================================================================
253 //
254 // class InstanceHandler
255 //
256 //==============================================================================
257
258 class InstanceHandler : public EnvelopeHandler
259 {
260 public:
261
262 enum State { INSTANCE, RESULT, DONE, FAILED };
263
264 InstanceHandler(
265 Handler* handler,
|
266 krisbash 1.3 Uint64 operationId,
|
267 mike 1.1 DInstance& instance)
268 :
269 EnvelopeHandler(handler),
270 m_state(INSTANCE),
|
271 krisbash 1.3 m_operationId(operationId),
|
272 mike 1.1 m_instance(instance),
|
273 krisbash 1.3 m_result(MI_RESULT_OK),
274 m_errorMessage(NULL),
275 m_cimerror(NULL)
|
276 mike 1.1 {
277 }
278
|
279 krisbash 1.3 virtual void HandleInstance(Uint64 operationId, const DInstance& instance)
|
280 mike 1.1 {
|
281 krisbash 1.3 if (operationId != m_operationId)
|
282 mike 1.1 {
|
283 krisbash 1.3 EnvelopeHandler::HandleInstance(operationId, instance);
|
284 mike 1.1 return;
285 }
286
287 if (m_state != INSTANCE)
288 {
289 m_state = FAILED;
290 return;
291 }
292
293 m_instance = instance;
294 m_state = RESULT;
295 }
296
|
297 krisbash 1.3 virtual void HandleResult(Uint64 operationId, Result result)
|
298 mike 1.1 {
|
299 krisbash 1.3 if (operationId != m_operationId)
|
300 mike 1.1 {
|
301 krisbash 1.3 EnvelopeHandler::HandleResult(operationId, result);
|
302 mike 1.1 return;
303 }
304
305 if (m_state != INSTANCE && m_state != RESULT)
306 {
307 m_state = FAILED;
308 return;
309 }
310
311 m_result = result;
312 m_state = DONE;
313 }
|
314 krisbash 1.3
315 virtual void HandleResult(Uint64 operationId, MI_Result result, const MI_Char *error, const DInstance* cimError)
316 {
317 if (operationId != m_operationId)
318 {
319 EnvelopeHandler::HandleResult(operationId, result, error, cimError);
320 return;
321 }
322
323 if (m_state != INSTANCE && m_state != RESULT)
324 {
325 m_state = FAILED;
326 return;
327 }
328
329 m_result = result;
330 m_cimerror = cimError;
331 m_errorMessage = error;
332 m_state = DONE;
333 }
|
334 mike 1.1
335 State m_state;
|
336 krisbash 1.3 Uint64 m_operationId;
|
337 mike 1.1 DInstance& m_instance;
338 Result m_result;
|
339 krisbash 1.3 const MI_Char *m_errorMessage;
340 const DInstance* m_cimerror;
|
341 mike 1.1 };
342
343 //==============================================================================
344 //
345 // class InstancesHandler
346 //
347 //==============================================================================
348
349 class InstancesHandler : public EnvelopeHandler
350 {
351 public:
352
353 enum State { INSTANCES, RESULT, DONE, FAILED };
354
355 InstancesHandler(
356 Handler* handler,
|
357 krisbash 1.3 Uint64 operationId,
|
358 mike 1.1 Array<DInstance>& instances)
359 :
360 EnvelopeHandler(handler),
361 m_state(INSTANCES),
|
362 krisbash 1.3 m_operationId(operationId),
|
363 mike 1.1 m_instances(instances),
364 m_result(MI_RESULT_OK)
365 {
366 }
367
|
368 krisbash 1.3 virtual void HandleInstance(Uint64 operationId, const DInstance& instance)
|
369 mike 1.1 {
|
370 krisbash 1.3 if (operationId != m_operationId)
|
371 mike 1.1 {
|
372 krisbash 1.3 EnvelopeHandler::HandleInstance(operationId, instance);
|
373 mike 1.1 return;
374 }
375
376 if (m_state != INSTANCES)
377 {
378 m_state = FAILED;
379 return;
380 }
381
382 m_instances.PushBack(instance);
383 }
384
|
385 krisbash 1.3 virtual void HandleResult(Uint64 operationId, Result result)
386 {
387 if (operationId != m_operationId)
388 {
389 EnvelopeHandler::HandleResult(operationId, result);
390 return;
391 }
392
393 if (m_state != INSTANCES)
394 {
395 m_state = FAILED;
396 return;
397 }
398
399 m_result = result;
400 m_state = DONE;
401 }
402
403 virtual void HandleResult(Uint64 operationId, Result result, const MI_Char *error, const DInstance* cimError)
|
404 mike 1.1 {
|
405 krisbash 1.3 if (operationId != m_operationId)
|
406 mike 1.1 {
|
407 krisbash 1.3 EnvelopeHandler::HandleResult(operationId, result);
|
408 mike 1.1 return;
409 }
410
411 if (m_state != INSTANCES)
412 {
413 m_state = FAILED;
414 return;
415 }
416
417 m_result = result;
418 m_state = DONE;
419 }
420
421 State m_state;
|
422 krisbash 1.3 Uint64 m_operationId;
|
423 mike 1.1 Array<DInstance>& m_instances;
424 Result m_result;
425 };
426
427 //==============================================================================
428 //
429 // class ClientRep
430 //
431 //==============================================================================
432
433 class ClientRep
434 {
435 public:
436 enum ConnectState
437 {
438 CONNECTSTATE_PENDING,
439 CONNECTSTATE_FAILED,
440 CONNECTSTATE_CONNECTED,
441 CONNECTSTATE_DISCONNECTED
442 };
443
|
444 krisbash 1.3 ProtocolSocketAndBase* protocol;
445 Strand strand; // To manage interaction with ProtocolSocket
|
446 mike 1.1 Handler* handler;
447 ConnectState connectState;
448
|
449 krisbash 1.3 static void MessageCallback(
450 ClientRep * rep,
451 Message* msg);
|
452 mike 1.1
453 bool NoOpAsync(
|
454 krisbash 1.3 Uint64 operationId);
|
455 mike 1.1
456 bool GetInstanceAsync(
457 const String& nameSpace,
458 const DInstance& instanceName,
|
459 krisbash 1.3 Uint64 operationId);
|
460 mike 1.1
461 bool CreateInstanceAsync(
462 const String& nameSpace,
463 const DInstance& instance,
|
464 krisbash 1.3 Uint64 operationId);
|
465 mike 1.1
466 bool ModifyInstanceAsync(
467 const String& nameSpace,
468 const DInstance& instance,
|
469 krisbash 1.3 Uint64 operationId);
|
470 mike 1.1
471 bool DeleteInstanceAsync(
472 const String& nameSpace,
473 const DInstance& instanceName,
|
474 krisbash 1.3 Uint64 operationId);
|
475 mike 1.1
476 bool EnumerateInstancesAsync(
477 const String& nameSpace,
478 const String& className,
479 bool deepInheritance,
480 const String& queryLanguage,
481 const String& queryExpression,
|
482 krisbash 1.3 Uint64 operationId);
|
483 mike 1.1
484 bool InvokeAsync(
485 const String& nameSpace,
486 const DInstance& instanceName,
487 const String& methodName,
488 const DInstance& inParameters,
489 DInstance& outParameters,
|
490 krisbash 1.3 Uint64 operationId);
|
491 mike 1.1
492 bool AssociatorInstancesAsync(
493 const String& nameSpace,
494 const DInstance& instanceName,
495 const String& assocClass,
496 const String& resultClass,
497 const String& role,
498 const String& resultRole,
|
499 krisbash 1.3 Uint64& operationId);
|
500 mike 1.1
501 bool ReferenceInstancesAsync(
502 const String& nameSpace,
503 const DInstance& instanceName,
|
504 krisbash 1.3 const String& resultClass,
|
505 mike 1.1 const String& role,
|
506 krisbash 1.3 Uint64& operationId);
|
507 mike 1.1 };
508
|
509 krisbash 1.3 void ClientRep::MessageCallback(
510 ClientRep * clientRep,
511 Message* msg)
|
512 mike 1.1 {
513 Handler* handler = clientRep->handler;
514
515 DEBUG_ASSERT(msg != 0);
516
517 switch (msg->tag)
518 {
519 case NoOpRspTag:
520 {
521 D( printf("ClientRep::MessageCallback(): NoOpRspTag\n"); )
522 NoOpRsp* rsp = (NoOpRsp*)msg;
523 MI_UNUSED(rsp);
524 if (handler)
|
525 krisbash 1.3 handler->HandleNoOp(rsp->base.operationId);
|
526 mike 1.1 break;
527 }
528 case PostInstanceMsgTag:
529 {
530 D( printf("ClientRep::MessageCallback(): PostInstanceMsgTag\n"); )
531 PostInstanceMsg* rsp = (PostInstanceMsg*)msg;
532
533 if (rsp->instance)
534 {
535 DInstance di(rsp->instance, DInstance::CLONE);
536 if (handler)
|
537 krisbash 1.3 handler->HandleInstance(rsp->base.operationId, di);
|
538 mike 1.1 }
539
540 break;
541 }
542 case PostResultMsgTag:
543 {
544 D( printf("ClientRep::MessageCallback(): PostResultMsgTag\n"); )
545 PostResultMsg* rsp = (PostResultMsg*)msg;
546 if (handler)
|
547 krisbash 1.3 {
548 if (rsp->cimError)
549 {
550 DInstance di((MI_Instance*)(rsp->cimError), DInstance::CLONE);
551 handler->HandleResult(rsp->base.operationId, rsp->result, rsp->errorMessage, &di);
552 }
553 else
554 {
555 handler->HandleResult(rsp->base.operationId, rsp->result, rsp->errorMessage, NULL);
556 }
557 }
|
558 mike 1.1 break;
559 }
560 default:
561 {
562 D( printf("ClientRep::MessageCallback(): default\n"); )
563 break;
564 }
565 }
566 }
567
568 bool ClientRep::NoOpAsync(
|
569 krisbash 1.3 Uint64 operationId)
|
570 mike 1.1 {
571 NoOpReq* req = 0;
572 bool result = true;
573
574 // Fail if not connected:
|
575 krisbash 1.3 if( !protocol || !strand.info.opened )
|
576 mike 1.1 {
577 result = false;
578 goto done;
579 }
580
581 // Create request message:
582 {
|
583 krisbash 1.3 req = NoOpReq_New(operationId);
|
584 mike 1.1
585 if (!req)
586 {
587 result = false;
588 goto done;
589 }
590 }
591
592 // Send the message:
593 {
|
594 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
595 mike 1.1 }
596
597 done:
598
599 if (req)
600 NoOpReq_Release(req);
601
602 return result;
603 }
604
605 bool ClientRep::GetInstanceAsync(
606 const String& nameSpace,
607 const DInstance& instanceName,
|
608 krisbash 1.3 Uint64 operationId)
|
609 mike 1.1 {
610 GetInstanceReq* req = 0;
611 bool result = true;
612
613 // Fail if not connected.
|
614 krisbash 1.3 if( !protocol || !strand.info.opened )
|
615 mike 1.1 {
616 result = false;
617 goto done;
618 }
619
620 // Create the request message:
621 {
|
622 krisbash 1.3 req = GetInstanceReq_New(operationId, BinaryProtocolFlag);
|
623 mike 1.1
624 if (!req)
625 {
626 result = false;
627 goto done;
628 }
629 }
630
631 // Set nameSpace:
|
632 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
633 if (!req->nameSpace)
634 {
635 result = false;
636 goto done;
637 }
|
638 mike 1.1
639 // Pack the instance name into the message's batch.
640 {
641 Result r = InstanceToBatch(
642 instanceName.m_self,
643 NULL,
644 NULL,
|
645 krisbash 1.3 req->base.base.batch,
|
646 mike 1.1 &req->packedInstanceNamePtr,
647 &req->packedInstanceNameSize);
648
649 if (r != MI_RESULT_OK)
650 {
651 result = false;
652 goto done;
653 }
654 }
655
656 // Send the messages:
657 {
|
658 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
659 mike 1.1 }
660
661 done:
662 if (req)
663 GetInstanceReq_Release(req);
664
665 return result;
666 }
667
668 bool ClientRep::CreateInstanceAsync(
669 const String& nameSpace,
670 const DInstance& instance,
|
671 krisbash 1.3 Uint64 operationId)
|
672 mike 1.1 {
673 CreateInstanceReq* req = 0;
674 bool result = true;
675
676 // Fail if not connected.
|
677 krisbash 1.3 if( !protocol || !strand.info.opened )
|
678 mike 1.1 {
679 result = false;
680 goto done;
681 }
682
683 // Create the request message:
684 {
|
685 krisbash 1.3 req = CreateInstanceReq_New(operationId, BinaryProtocolFlag);
|
686 mike 1.1
687 if (!req)
688 {
689 result = false;
690 goto done;
691 }
692 }
693
694 // Set nameSpace:
|
695 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
696 if (!req->nameSpace)
697 {
698 result = false;
699 goto done;
700 }
|
701 mike 1.1
702 // Pack the instance name into the message's batch.
703 {
704 Result r = InstanceToBatch(
705 instance.m_self,
706 NULL,
707 NULL,
|
708 krisbash 1.3 req->base.base.batch,
|
709 mike 1.1 &req->packedInstancePtr,
710 &req->packedInstanceSize);
711
712 if (r != MI_RESULT_OK)
713 {
714 result = false;
715 goto done;
716 }
717 }
718
719 // Send the messages:
720 {
|
721 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
722 mike 1.1 }
723
724 done:
725 if (req)
726 CreateInstanceReq_Release(req);
727
728 return result;
729 }
730
731 bool ClientRep::ModifyInstanceAsync(
732 const String& nameSpace,
733 const DInstance& instance,
|
734 krisbash 1.3 Uint64 operationId)
|
735 mike 1.1 {
736 ModifyInstanceReq* req = 0;
737 bool result = true;
738
739 // Fail if not connected.
|
740 krisbash 1.3 if( !protocol || !strand.info.opened )
|
741 mike 1.1 {
742 result = false;
743 goto done;
744 }
745
746 // Create the request message:
747 {
|
748 krisbash 1.3 req = ModifyInstanceReq_New(operationId, BinaryProtocolFlag);
|
749 mike 1.1
750 if (!req)
751 {
752 result = false;
753 goto done;
754 }
755 }
756
757 // Set nameSpace:
|
758 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
759 if (!req->nameSpace)
760 {
761 result = false;
762 goto done;
763 }
|
764 mike 1.1
765 // Pack the instance name into the message's batch.
766 {
767 Result r = InstanceToBatch(
768 instance.m_self,
769 NULL,
770 NULL,
|
771 krisbash 1.3 req->base.base.batch,
|
772 mike 1.1 &req->packedInstancePtr,
773 &req->packedInstanceSize);
774
775 if (r != MI_RESULT_OK)
776 {
777 result = false;
778 goto done;
779 }
780 }
781
782 // Send the messages:
|
783 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
784 mike 1.1
785 done:
786 if (req)
787 ModifyInstanceReq_Release(req);
788
789 return result;
790 }
791
792 bool ClientRep::DeleteInstanceAsync(
793 const String& nameSpace,
794 const DInstance& instanceName,
|
795 krisbash 1.3 Uint64 operationId)
|
796 mike 1.1 {
797 DeleteInstanceReq* req = 0;
798 bool result = true;
799
800 // Fail if not connected.
|
801 krisbash 1.3 if( !protocol || !strand.info.opened )
|
802 mike 1.1 {
803 result = false;
804 goto done;
805 }
806
807 // Create the request message:
808 {
|
809 krisbash 1.3 req = DeleteInstanceReq_New(operationId, BinaryProtocolFlag);
|
810 mike 1.1
811 if (!req)
812 {
813 result = false;
814 goto done;
815 }
816 }
817
818 // Set nameSpace:
|
819 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
820 if (!req->nameSpace)
821 {
822 result = false;
823 goto done;
824 }
|
825 mike 1.1
826 // Pack the instance name into the message's batch.
827 {
828 Result r = InstanceToBatch(
829 instanceName.m_self,
830 NULL,
831 NULL,
|
832 krisbash 1.3 req->base.base.batch,
|
833 mike 1.1 &req->packedInstanceNamePtr,
834 &req->packedInstanceNameSize);
835
836 if (r != MI_RESULT_OK)
837 {
838 result = false;
839 goto done;
840 }
841 }
842
843 // Send the messages:
|
844 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
845 mike 1.1
846 done:
847 if (req)
848 DeleteInstanceReq_Release(req);
849
850 return result;
851 }
852
853 bool ClientRep::EnumerateInstancesAsync(
854 const String& nameSpace,
855 const String& className,
856 bool deepInheritance,
857 const String& queryLanguage,
858 const String& queryExpression,
|
859 krisbash 1.3 Uint64 operationId)
|
860 mike 1.1 {
861 EnumerateInstancesReq* req = 0;
862 bool result = true;
863
864 // Fail if not connected.
|
865 krisbash 1.3 if( !protocol || !strand.info.opened )
|
866 mike 1.1 {
867 result = false;
868 goto done;
869 }
870
871 // Create the request message:
872 {
|
873 krisbash 1.3 req = EnumerateInstancesReq_New(operationId, BinaryProtocolFlag);
|
874 mike 1.1
875 if (!req)
876 {
877 result = false;
878 goto done;
879 }
880 }
881
882 // Populate the fields of the request message:
883 {
|
884 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
885 req->className = Batch_Tcsdup(req->base.base.batch, className.Str());
886
887 if (!req->nameSpace || !req->className)
888 {
889 result = false;
890 goto done;
891 }
|
892 mike 1.1
893 if (queryLanguage.GetSize())
894 {
895 req->queryLanguage =
|
896 krisbash 1.3 Batch_Tcsdup(req->base.base.batch, queryLanguage.Str());
897 if (!req->queryLanguage)
898 {
899 result = false;
900 goto done;
901 }
|
902 mike 1.1 }
903
904 if (queryExpression.GetSize())
905 {
906 req->queryExpression =
|
907 krisbash 1.3 Batch_Tcsdup(req->base.base.batch, queryExpression.Str());
908 if (!req->queryExpression)
909 {
910 result = false;
911 goto done;
912 }
|
913 mike 1.1 }
914
915 req->deepInheritance = deepInheritance;
916 }
917
918 // Send the messages:
|
919 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
920 mike 1.1
921 done:
922 if (req)
923 EnumerateInstancesReq_Release(req);
924
925 return result;
926 }
927
928 bool ClientRep::InvokeAsync(
929 const String& nameSpace,
930 const DInstance& instanceName,
931 const String& methodName,
932 const DInstance& inParameters,
933 DInstance& outParameters,
|
934 krisbash 1.3 Uint64 operationId)
|
935 mike 1.1 {
936 InvokeReq* req = 0;
937 bool result = true;
938
939 // Fail if not connected.
|
940 krisbash 1.3 if( !protocol || !strand.info.opened )
|
941 mike 1.1 {
942 result = false;
943 goto done;
944 }
945
946 // Create the request message:
947 {
|
948 krisbash 1.3 req = InvokeReq_New(operationId, BinaryProtocolFlag);
|
949 mike 1.1
950 if (!req)
951 {
952 result = false;
953 goto done;
954 }
955 }
956
957 // Set nameSpace:
|
958 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
959 if (!req->nameSpace)
960 {
961 result = false;
962 goto done;
963 }
|
964 mike 1.1
965 // Set className:
|
966 krisbash 1.3 req->className = Batch_Tcsdup(req->base.base.batch,
|
967 mike 1.1 instanceName.GetClassName().Str());
|
968 krisbash 1.3 if (!req->className)
969 {
970 result = false;
971 goto done;
972 }
|
973 mike 1.1
974 // Set methodName:
|
975 krisbash 1.3 req->function = Batch_Tcsdup(req->base.base.batch, methodName.Str());
976 if (!req->function)
977 {
978 result = false;
979 goto done;
980 }
|
981 mike 1.1
982 // Pack instanceName:
983 if (instanceName.Count())
984 {
985 Result r = InstanceToBatch(
986 instanceName.m_self,
987 NULL,
988 NULL,
|
989 krisbash 1.3 req->base.base.batch,
|
990 mike 1.1 &req->packedInstancePtr,
991 &req->packedInstanceSize);
992
993 if (r != MI_RESULT_OK)
994 {
995 result = false;
996 goto done;
997 }
998 }
999
1000 // Pack inParameters:
1001 {
1002 Result r = InstanceToBatch(
1003 inParameters.m_self,
1004 NULL,
1005 NULL,
|
1006 krisbash 1.3 req->base.base.batch,
|
1007 mike 1.1 &req->packedInstanceParamsPtr,
1008 &req->packedInstanceParamsSize);
1009
1010 if (r != MI_RESULT_OK)
1011 {
1012 result = false;
1013 goto done;
1014 }
1015 }
1016
1017 // Send the messages:
|
1018 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
1019 mike 1.1
1020 done:
1021 if (req)
1022 InvokeReq_Release(req);
1023
1024 return result;
1025 }
1026
1027 bool ClientRep::AssociatorInstancesAsync(
1028 const String& nameSpace,
1029 const DInstance& instanceName,
1030 const String& assocClass,
1031 const String& resultClass,
1032 const String& role,
1033 const String& resultRole,
|
1034 krisbash 1.3 Uint64& operationId)
|
1035 mike 1.1 {
|
1036 krisbash 1.3 AssociationsOfReq* req = 0;
|
1037 mike 1.1 bool result = true;
1038
1039 // Fail if not connected.
|
1040 krisbash 1.3 if( !protocol || !strand.info.opened )
|
1041 mike 1.1 {
1042 result = false;
1043 goto done;
1044 }
1045
1046 // Create the request message:
1047 {
|
1048 krisbash 1.3 req = AssociationsOfReq_New(operationId, BinaryProtocolFlag, AssociatorsOfReqTag);
|
1049 mike 1.1
1050 if (!req)
1051 {
1052 result = false;
1053 goto done;
1054 }
1055 }
1056
1057 // Set nameSpace:
|
1058 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
1059 if (!req->nameSpace)
1060 {
1061 result = false;
1062 goto done;
1063 }
|
1064 mike 1.1
1065 // Set assocClass:
1066 if (assocClass.GetSize())
|
1067 krisbash 1.3 {
1068 req->assocClass = Batch_Tcsdup(req->base.base.batch, assocClass.Str());
1069 if (!req->assocClass)
1070 {
1071 result = false;
1072 goto done;
1073 }
1074 }
|
1075 mike 1.1
1076 // Set resultClass:
1077 if (resultClass.GetSize())
|
1078 krisbash 1.3 {
1079 req->resultClass = Batch_Tcsdup(req->base.base.batch,resultClass.Str());
1080 if (!req->resultClass)
1081 {
1082 result = false;
1083 goto done;
1084 }
1085 }
|
1086 mike 1.1
1087 // Set role:
1088 if (role.GetSize())
|
1089 krisbash 1.3 {
1090 req->role = Batch_Tcsdup(req->base.base.batch, role.Str());
1091 if (!req->role)
1092 {
1093 result = false;
1094 goto done;
1095 }
1096 }
|
1097 mike 1.1
1098 // Set resultRole:
1099 if (resultRole.GetSize())
|
1100 krisbash 1.3 {
1101 req->resultRole = Batch_Tcsdup(req->base.base.batch, resultRole.Str());
1102 if (!req->resultRole)
1103 {
1104 result = false;
1105 goto done;
1106 }
1107 }
|
1108 mike 1.1
1109 // Pack the instance name into the message's batch.
1110 {
1111 Result r = InstanceToBatch(
1112 instanceName.m_self,
1113 NULL,
1114 NULL,
|
1115 krisbash 1.3 req->base.base.batch,
|
1116 mike 1.1 &req->packedInstancePtr,
1117 &req->packedInstanceSize);
1118
1119 if (r != MI_RESULT_OK)
1120 {
1121 result = false;
1122 goto done;
1123 }
1124 }
1125
1126 // Send the messages:
|
1127 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
1128 mike 1.1
1129 done:
1130 if (req)
1131 {
|
1132 krisbash 1.3 AssociationsOfReq_Release(req);
|
1133 mike 1.1 }
1134
1135 return result;
1136 }
1137
1138 bool ClientRep::ReferenceInstancesAsync(
1139 const String& nameSpace,
1140 const DInstance& instanceName,
|
1141 krisbash 1.3 const String& resultClass,
|
1142 mike 1.1 const String& role,
|
1143 krisbash 1.3 Uint64& operationId)
|
1144 mike 1.1 {
|
1145 krisbash 1.3 AssociationsOfReq* req = 0;
|
1146 mike 1.1 bool result = true;
1147
1148 // Fail if not connected.
|
1149 krisbash 1.3 if( !protocol || !strand.info.opened )
|
1150 mike 1.1 {
1151 result = false;
1152 goto done;
1153 }
1154
1155 // Create the request message:
1156 {
|
1157 krisbash 1.3 req = AssociationsOfReq_New(operationId, BinaryProtocolFlag, ReferencesOfReqTag);
|
1158 mike 1.1
1159 if (!req)
1160 {
1161 result = false;
1162 goto done;
1163 }
1164 }
1165
1166 // Set nameSpace:
|
1167 krisbash 1.3 req->nameSpace = Batch_Tcsdup(req->base.base.batch, nameSpace.Str());
1168 if (!req->nameSpace)
1169 {
1170 result = false;
1171 goto done;
1172 }
|
1173 mike 1.1
1174 // Set assocClass:
|
1175 krisbash 1.3 if (resultClass.GetSize())
1176 {
1177 req->resultClass = Batch_Tcsdup(req->base.base.batch, resultClass.Str());
1178 if (!req->resultClass)
1179 {
1180 result = false;
1181 goto done;
1182 }
1183 }
|
1184 mike 1.1
1185 // Set role:
1186 if (role.GetSize())
|
1187 krisbash 1.3 {
1188 req->role = Batch_Tcsdup(req->base.base.batch, role.Str());
1189 if (!req->role)
1190 {
1191 result = false;
1192 goto done;
1193 }
1194 }
|
1195 mike 1.1
1196 // Pack the instance name into the message's batch.
1197 {
1198 Result r = InstanceToBatch(
1199 instanceName.m_self,
1200 NULL,
1201 NULL,
|
1202 krisbash 1.3 req->base.base.batch,
|
1203 mike 1.1 &req->packedInstancePtr,
1204 &req->packedInstanceSize);
1205
1206 if (r != MI_RESULT_OK)
1207 {
1208 result = false;
1209 goto done;
1210 }
1211 }
1212
1213 // Send the messages:
|
1214 krisbash 1.3 Strand_SchedulePost(&strand,&req->base.base);
|
1215 mike 1.1
1216 done:
1217 if (req)
|
1218 krisbash 1.3 AssociationsOfReq_Release(req);
|
1219 mike 1.1
1220 return result;
1221 }
1222
1223 //==============================================================================
|
1224 krisbash 1.3
1225 MI_EXTERN_C void _Client_Post( _In_ Strand* self_, _In_ Message* msg)
1226 {
1227 ClientRep* rep = FromOffset(ClientRep,strand,self_);
1228
1229 trace_Client_Post(
1230 msg,
1231 msg->tag,
1232 MessageName(msg->tag),
1233 msg->operationId );
1234
1235 ClientRep::MessageCallback( rep, msg );
1236
1237 Strand_Ack(self_); // return an Ack to protocol
1238 }
1239
1240 MI_EXTERN_C void _Client_PostControl( _In_ Strand* self_, _In_ Message* msg)
1241 {
1242 ClientRep* rep = FromOffset(ClientRep,strand,self_);
1243 ProtocolEventConnect* eventMsg = (ProtocolEventConnect*)msg;
1244 Handler* handler = rep->handler;
1245 krisbash 1.3
1246 DEBUG_ASSERT( ProtocolEventConnectTag == msg->tag );
1247
1248 if( eventMsg->success )
1249 {
1250 D( printf("==== EventCallback() PROTOCOLEVENT_CONNECT\n"); )
1251 rep->connectState = ClientRep::CONNECTSTATE_CONNECTED;
1252 if (handler)
1253 handler->HandleConnect();
1254 }
1255 else
1256 {
1257 D( printf("==== EventCallback() PROTOCOLEVENT_CONNECT_FAILED\n"); )
1258 if (handler)
1259 handler->HandleConnectFailed();
1260 rep->connectState = ClientRep::CONNECTSTATE_FAILED;
1261 }
1262 }
1263
1264 MI_EXTERN_C void _Client_Ack( _In_ Strand* self )
1265 {
1266 krisbash 1.3 trace_Client_Ack();
1267 // We are not streaming any results, so no need to manage flow control on Ack
1268 }
1269
1270 MI_EXTERN_C void _Client_Cancel( _In_ Strand* self )
1271 {
1272 DEBUG_ASSERT( MI_FALSE ); // not used yet
1273 }
1274
1275 MI_EXTERN_C void _Client_Close( _In_ Strand* self_ )
1276 {
1277 ClientRep* rep = FromOffset(ClientRep,strand,self_);
1278 Handler* handler = rep->handler;
1279
1280 trace_Client_Close();
1281 // most management done by strand implementation
1282
1283 if (handler)
1284 handler->HandleDisconnect();
1285 rep->connectState = ClientRep::CONNECTSTATE_DISCONNECTED;
1286 }
1287 krisbash 1.3
1288 MI_EXTERN_C void _Client_Finish( _In_ Strand* self_ )
1289 {
1290 trace_Client_Finish();
1291 // nothing to do here, (class take care of deleting itself)
1292 }
1293
1294 /*
1295 Object that implements the C++ client endpoint.
1296 It opens an interaction to the binary protocol below
1297 to communicate on a TCP Socket.
1298
1299 Behavior:
1300 - Post just passed the operation to tries to ClientRep::MessageCallback
1301 if that fails it sends the Ack immediately
1302 - Post control is used to notify connected state (connect succeeded/failed)
1303 - Ack does not do anything at this point (as there are no secondary messages)
1304 - Cancel is not used
1305 - Puts it on disconnected state if not there already
1306 - Shutdown:
1307 The Client objects are shutdown/deleted thru the normal
1308 krisbash 1.3 Strand logic (once the interaction is closed).
1309 */
1310 StrandFT _Client_InteractionFT =
1311 {
1312 _Client_Post,
1313 _Client_PostControl,
1314 _Client_Ack,
1315 _Client_Cancel,
1316 _Client_Close,
1317 _Client_Finish,
1318 NULL,
1319 NULL,
1320 NULL,
1321 NULL,
1322 NULL,
1323 NULL
1324 };
1325
1326 //==============================================================================
|
1327 mike 1.1 //
1328 // class Client
1329 //
1330 //==============================================================================
1331
1332 Client::Client(Handler* handler)
1333 {
1334 m_rep = new ClientRep;
1335 m_rep->protocol = 0;
1336 m_rep->connectState = ClientRep::CONNECTSTATE_DISCONNECTED;
1337 m_rep->handler = handler;
|
1338 krisbash 1.3
1339 //Log_OpenStdErr();
1340 //Log_SetLevel(LOG_DEBUG);
1341
1342 Strand_Init( STRAND_DEBUG(OmiClient) &m_rep->strand, &_Client_InteractionFT, STRAND_FLAG_ENTERSTRAND, NULL ); // this is the one that Opens the interaction (not the one that receives the open)
|
1343 mike 1.1 }
1344
1345 Client::~Client()
1346 {
1347 Disconnect();
1348 delete m_rep->handler;
1349 delete m_rep;
1350 }
1351
1352 bool Client::ConnectAsync(
1353 const String& locatorIn,
1354 const String& user,
1355 const String& password)
1356 {
1357 Result r;
1358 bool result = true;
1359 String locator = locatorIn;
1360 char* locator_ = NULL;
1361 char* user_ = NULL;
1362 char* password_ = NULL;
1363
1364 mike 1.1 // Fail if already connected:
1365 if (m_rep->protocol)
1366 {
1367 result = false;
1368 goto done;
1369 }
1370
1371 // Locator defaults to SOCKETFILE:
1372 if (locator.GetSize() == 0)
1373 {
1374 #ifdef CONFIG_POSIX
|
1375 krisbash 1.3 locator = _StrToString(OMI_GetPath(ID_SOCKETFILE));
|
1376 mike 1.1 #else
1377 locator = MI_T("localhost:7777");
1378 #endif
1379 }
1380
1381 // Convert host to 'char' type:
1382 locator_ = _StringToStr(locator);
1383 if (!locator_)
1384 {
1385 goto done;
1386 }
1387 user_ = _StringToStr(user);
1388 if (!user_)
1389 {
1390 goto done;
1391 }
1392 password_ = _StringToStr(password);
1393 if (!password_)
1394 {
1395 goto done;
1396 }
1397 mike 1.1
1398 // Set connection state to pending.
1399 m_rep->connectState = ClientRep::CONNECTSTATE_PENDING;
1400
1401 // Establish connection with server:
1402 {
|
1403 krisbash 1.3 InteractionOpenParams params;
1404 ProtocolSocketAndBase* protocol = NULL;
1405
1406 Strand_OpenPrepare(&m_rep->strand,¶ms,NULL,NULL,MI_TRUE);
1407
1408 r = ProtocolSocketAndBase_New_Connector(
|
1409 mike 1.1 &protocol,
1410 NULL,
1411 locator_,
|
1412 krisbash 1.3 ¶ms,
|
1413 mike 1.1 user_,
|
1414 krisbash 1.3 password_ );
|
1415 mike 1.1
1416 if (r != MI_RESULT_OK)
1417 {
1418 result = false;
1419 goto done;
1420 }
1421
1422 m_rep->protocol = protocol;
1423 }
1424
1425 done:
1426
1427 if (locator_)
1428 delete [] locator_;
1429 if (user_)
1430 delete [] user_;
1431 if (password_)
1432 delete [] password_;
1433 return result;
1434 }
1435
1436 mike 1.1 bool Client::Connect(
1437 const String& locator,
1438 const String& user,
1439 const String& password,
1440 Uint64 timeOutUsec)
1441 {
1442 m_rep->connectState = ClientRep::CONNECTSTATE_PENDING;
1443
1444 if (!ConnectAsync(locator, user, password))
1445 return false;
1446
1447 Uint64 endTime, now;
1448
|
1449 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1450 mike 1.1 return false;
1451
1452 endTime = now + timeOutUsec;
1453
1454 // Wait for connection establishment or timeout.
1455 for (;endTime >= now;)
1456 {
|
1457 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1458 mike 1.1
1459 if (m_rep->connectState != ClientRep::CONNECTSTATE_PENDING)
1460 break;
1461
|
1462 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1463 mike 1.1 break;
1464 }
1465
1466 if (m_rep->connectState != ClientRep::CONNECTSTATE_CONNECTED)
1467 return false;
1468
1469 return true;
1470 }
1471
1472 bool Client::Disconnect()
1473 {
1474 bool result = true;
1475
1476 // Fail if not connected:
|
1477 krisbash 1.3 if( !m_rep->protocol || !m_rep->strand.info.opened )
|
1478 mike 1.1 {
1479 result = false;
1480 goto done;
1481 }
1482
|
1483 krisbash 1.3 if ( m_rep->strand.info.opened )
1484 {
1485 Strand_ScheduleClose( &m_rep->strand );
1486 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
1487 }
1488
|
1489 mike 1.1 // Delete the protocol object.
1490 {
|
1491 krisbash 1.3 ProtocolSocketAndBase_ReadyToFinish(m_rep->protocol);
|
1492 mike 1.1
1493 m_rep->protocol = 0;
1494 }
1495
1496 m_rep->connectState = ClientRep::CONNECTSTATE_DISCONNECTED;
1497
1498 done:
1499 return result;
1500 }
1501
1502 bool Client::Connected() const
1503 {
|
1504 krisbash 1.3 return m_rep->protocol && m_rep->strand.info.opened ? true : false;
|
1505 mike 1.1 }
1506
1507 bool Client::Run(Uint64 timeOutUsec)
1508 {
1509 bool result = true;
1510
1511 // Fail if not connected.
|
1512 krisbash 1.3 if (!m_rep->protocol || !m_rep->strand.info.opened)
|
1513 mike 1.1 {
1514 result = false;
1515 goto done;
1516 }
1517
1518 // Process events.
1519 // ATTN: what can this return?
|
1520 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, timeOutUsec);
|
1521 mike 1.1
1522 done:
1523 return result;
1524 }
1525
1526 bool Client::NoOpAsync(
|
1527 krisbash 1.3 Uint64& operationId)
|
1528 mike 1.1 {
|
1529 krisbash 1.3 operationId = _NextOperationId();
1530 return m_rep->NoOpAsync(operationId);
|
1531 mike 1.1 }
1532
1533 bool Client::GetInstanceAsync(
1534 const String& nameSpace,
1535 const DInstance& instanceName,
|
1536 krisbash 1.3 Uint64& operationId)
|
1537 mike 1.1 {
|
1538 krisbash 1.3 operationId = _NextOperationId();
1539 return m_rep->GetInstanceAsync(nameSpace, instanceName, operationId);
|
1540 mike 1.1 }
1541
1542 bool Client::CreateInstanceAsync(
1543 const String& nameSpace,
1544 const DInstance& instance,
|
1545 krisbash 1.3 Uint64& operationId)
|
1546 mike 1.1 {
|
1547 krisbash 1.3 operationId = _NextOperationId();
1548 return m_rep->CreateInstanceAsync(nameSpace, instance, operationId);
|
1549 mike 1.1 }
1550
1551 bool Client::ModifyInstanceAsync(
1552 const String& nameSpace,
1553 const DInstance& instance,
|
1554 krisbash 1.3 Uint64& operationId)
|
1555 mike 1.1 {
|
1556 krisbash 1.3 operationId = _NextOperationId();
1557 return m_rep->ModifyInstanceAsync(nameSpace, instance, operationId);
|
1558 mike 1.1 }
1559
1560 bool Client::DeleteInstanceAsync(
1561 const String& nameSpace,
1562 const DInstance& instanceName,
|
1563 krisbash 1.3 Uint64& operationId)
|
1564 mike 1.1 {
|
1565 krisbash 1.3 operationId = _NextOperationId();
1566 return m_rep->DeleteInstanceAsync(nameSpace, instanceName, operationId);
|
1567 mike 1.1 }
1568
1569 bool Client::EnumerateInstancesAsync(
1570 const String& nameSpace,
1571 const String& className,
1572 bool deepInheritance,
1573 const String& queryLanguage,
1574 const String& queryExpression,
|
1575 krisbash 1.3 Uint64& operationId)
|
1576 mike 1.1 {
|
1577 krisbash 1.3 operationId = _NextOperationId();
|
1578 mike 1.1 return m_rep->EnumerateInstancesAsync(nameSpace, className,
|
1579 krisbash 1.3 deepInheritance, queryLanguage, queryExpression, operationId);
|
1580 mike 1.1 }
1581
1582 bool Client::InvokeAsync(
1583 const String& nameSpace,
1584 const DInstance& instanceName,
1585 const String& methodName,
1586 const DInstance& inParameters,
1587 DInstance& outParameters,
|
1588 krisbash 1.3 Uint64 operationId)
|
1589 mike 1.1 {
|
1590 krisbash 1.3 operationId = _NextOperationId();
|
1591 mike 1.1 return m_rep->InvokeAsync(nameSpace, instanceName, methodName, inParameters,
|
1592 krisbash 1.3 outParameters, operationId);
|
1593 mike 1.1 }
1594
1595 bool Client::AssociatorInstancesAsync(
1596 const String& nameSpace,
1597 const DInstance& instanceName,
1598 const String& assocClass,
1599 const String& resultClass,
1600 const String& role,
1601 const String& resultRole,
|
1602 krisbash 1.3 Uint64& operationId)
|
1603 mike 1.1 {
|
1604 krisbash 1.3 operationId = _NextOperationId();
|
1605 mike 1.1 return m_rep->AssociatorInstancesAsync(nameSpace, instanceName, assocClass,
|
1606 krisbash 1.3 resultClass, role, resultRole, operationId);
|
1607 mike 1.1 }
1608
1609 bool Client::ReferenceInstancesAsync(
1610 const String& nameSpace,
1611 const DInstance& instanceName,
1612 const String& assocClass,
1613 const String& role,
|
1614 krisbash 1.3 Uint64& operationId)
|
1615 mike 1.1 {
|
1616 krisbash 1.3 operationId = _NextOperationId();
|
1617 mike 1.1 return m_rep->ReferenceInstancesAsync(nameSpace, instanceName, assocClass,
|
1618 krisbash 1.3 role, operationId);
|
1619 mike 1.1 }
1620
1621 bool Client::GetInstance(
1622 const String& nameSpace,
1623 const DInstance& instanceName,
1624 Uint64 timeOutUsec,
1625 DInstance& instance,
1626 Result& result)
1627 {
1628 Handler* oldHandler = m_rep->handler;
|
1629 krisbash 1.3 Uint64 operationId = _NextOperationId();
1630 InstanceHandler handler(oldHandler, operationId, instance);
|
1631 mike 1.1 m_rep->handler = &handler;
1632 bool flag = true;
1633
|
1634 krisbash 1.3 if (!m_rep->GetInstanceAsync(nameSpace, instanceName, operationId))
|
1635 mike 1.1 {
1636 flag = false;
1637 goto done;
1638 }
1639
1640 Uint64 endTime, now;
1641
|
1642 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1643 mike 1.1 return false;
1644
1645 endTime = now + timeOutUsec;
1646
1647 for (;endTime >= now;)
1648 {
|
1649 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1650 mike 1.1
1651 if (handler.m_state == InstanceHandler::FAILED ||
1652 handler.m_state == InstanceHandler::DONE)
1653 {
1654 break;
1655 }
1656
|
1657 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1658 mike 1.1 break;
1659 }
1660
1661 if (handler.m_state == InstanceHandler::DONE)
1662 result = handler.m_result;
1663 else
1664 flag = false;
1665
1666 done:
1667 m_rep->handler = oldHandler;
1668 return flag;
1669 }
1670
1671 bool Client::CreateInstance(
1672 const String& nameSpace,
1673 const DInstance& instance,
1674 Uint64 timeOutUsec,
1675 DInstance& instanceName,
1676 Result& result)
1677 {
1678 Handler* oldHandler = m_rep->handler;
|
1679 krisbash 1.3 Uint64 operationId = _NextOperationId();
1680 InstanceHandler handler(oldHandler, operationId, instanceName);
|
1681 mike 1.1 m_rep->handler = &handler;
1682 bool flag = true;
1683
|
1684 krisbash 1.3 if (!m_rep->CreateInstanceAsync(nameSpace, instance, operationId))
|
1685 mike 1.1 {
1686 flag = false;
1687 goto done;
1688 }
1689
1690 Uint64 endTime, now;
1691
|
1692 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1693 mike 1.1 return false;
1694
1695 endTime = now + timeOutUsec;
1696
1697 for (;endTime >= now;)
1698 {
|
1699 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1700 mike 1.1
1701 if (handler.m_state == InstanceHandler::FAILED ||
1702 handler.m_state == InstanceHandler::DONE)
1703 {
1704 break;
1705 }
1706
|
1707 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1708 mike 1.1 break;
1709 }
1710
1711 if (handler.m_state == InstanceHandler::DONE)
1712 result = handler.m_result;
1713 else
1714 flag = false;
1715
1716 done:
1717 m_rep->handler = oldHandler;
1718 return flag;
1719 }
1720
1721 bool Client::ModifyInstance(
1722 const String& nameSpace,
1723 const DInstance& instance,
1724 Uint64 timeOutUsec,
1725 Result& result)
1726 {
1727 Handler* oldHandler = m_rep->handler;
|
1728 krisbash 1.3 Uint64 operationId = _NextOperationId();
1729 ResultHandler handler(oldHandler, operationId);
|
1730 mike 1.1 m_rep->handler = &handler;
1731 bool flag = true;
1732
|
1733 krisbash 1.3 if (!m_rep->ModifyInstanceAsync(nameSpace, instance, operationId))
|
1734 mike 1.1 {
1735 flag = false;
1736 goto done;
1737 }
1738
1739 Uint64 endTime, now;
1740
|
1741 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1742 mike 1.1 return false;
1743
1744 endTime = now + timeOutUsec;
1745
1746 for (;endTime >= now;)
1747 {
|
1748 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1749 mike 1.1
1750 if (handler.m_state == ResultHandler::FAILED ||
1751 handler.m_state == ResultHandler::DONE)
1752 {
1753 break;
1754 }
1755
|
1756 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1757 mike 1.1 break;
1758 }
1759
1760 if (handler.m_state == ResultHandler::DONE)
1761 result = handler.m_result;
1762 else
1763 flag = false;
1764
1765 done:
1766 m_rep->handler = oldHandler;
1767 return flag;
1768 }
1769
1770 bool Client::DeleteInstance(
1771 const String& nameSpace,
1772 const DInstance& instanceName,
1773 Uint64 timeOutUsec,
1774 Result& result)
1775 {
1776 Handler* oldHandler = m_rep->handler;
|
1777 krisbash 1.3 Uint64 operationId = _NextOperationId();
1778 ResultHandler handler(oldHandler, operationId);
|
1779 mike 1.1 m_rep->handler = &handler;
1780 bool flag = true;
1781
|
1782 krisbash 1.3 if (!m_rep->DeleteInstanceAsync(nameSpace, instanceName, operationId))
|
1783 mike 1.1 {
1784 flag = false;
1785 goto done;
1786 }
1787
1788 Uint64 endTime, now;
1789
|
1790 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1791 mike 1.1 return false;
1792
1793 endTime = now + timeOutUsec;
1794
1795 for (;endTime >= now;)
1796 {
|
1797 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1798 mike 1.1
1799 if (handler.m_state == ResultHandler::FAILED ||
1800 handler.m_state == ResultHandler::DONE)
1801 {
1802 break;
1803 }
1804
|
1805 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1806 mike 1.1 break;
1807 }
1808
1809 if (handler.m_state == ResultHandler::DONE)
1810 result = handler.m_result;
1811 else
1812 flag = false;
1813
1814 done:
1815 m_rep->handler = oldHandler;
1816 return flag;
1817 }
1818
1819 bool Client::NoOp(Uint64 timeOutUsec)
1820 {
1821 Handler* oldHandler = m_rep->handler;
|
1822 krisbash 1.3 Uint64 operationId = _NextOperationId();
1823 NoOpHandler handler(oldHandler, operationId);
|
1824 mike 1.1 m_rep->handler = &handler;
1825 bool flag = true;
1826
|
1827 krisbash 1.3 if (!m_rep->NoOpAsync(operationId))
|
1828 mike 1.1 {
1829 flag = false;
1830 goto done;
1831 }
1832
1833 Uint64 endTime, now;
1834
|
1835 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1836 mike 1.1 return false;
1837
1838 endTime = now + timeOutUsec;
1839
1840 for (;endTime >= now;)
1841 {
|
1842 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1843 mike 1.1
1844 if (handler.m_state == NoOpHandler::FAILED ||
1845 handler.m_state == NoOpHandler::DONE)
1846 {
1847 break;
1848 }
1849
|
1850 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1851 mike 1.1 break;
1852 }
1853
1854 if (handler.m_state != NoOpHandler::DONE)
1855 flag = false;
1856
1857 done:
1858 m_rep->handler = oldHandler;
1859 return flag;
1860 }
1861
1862 bool Client::EnumerateInstances(
1863 const String& nameSpace,
1864 const String& className,
1865 bool deepInheritance,
1866 Uint64 timeOutUsec,
1867 Array<DInstance>& instances,
1868 const String& queryLanguage,
1869 const String& queryExpression,
1870 Result& result)
1871 {
1872 mike 1.1 Handler* oldHandler = m_rep->handler;
|
1873 krisbash 1.3 Uint64 operationId = _NextOperationId();
1874 InstancesHandler handler(oldHandler, operationId, instances);
|
1875 mike 1.1 m_rep->handler = &handler;
1876 bool flag = true;
1877
1878 if (!m_rep->EnumerateInstancesAsync(nameSpace, className, deepInheritance,
|
1879 krisbash 1.3 queryLanguage, queryExpression, operationId))
|
1880 mike 1.1 {
1881 flag = false;
1882 goto done;
1883 }
1884
1885 Uint64 endTime, now;
1886
|
1887 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1888 mike 1.1 return false;
1889
1890 endTime = now + timeOutUsec;
1891
1892 for (;endTime >= now;)
1893 {
|
1894 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1895 mike 1.1
1896 if (handler.m_state == InstancesHandler::FAILED ||
1897 handler.m_state == InstancesHandler::DONE)
1898 {
1899 break;
1900 }
1901
|
1902 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1903 mike 1.1 break;
1904 }
1905
1906 if (handler.m_state == InstancesHandler::DONE)
1907 result = handler.m_result;
1908 else
1909 flag = false;
1910
1911 done:
1912 m_rep->handler = oldHandler;
1913 return flag;
1914 }
1915
1916 bool Client::Invoke(
1917 const String& nameSpace,
1918 const DInstance& instanceName,
1919 const String& methodName,
1920 const DInstance& inParameters,
1921 Uint64 timeOutUsec,
1922 DInstance& outParameters,
1923 Result& result)
1924 mike 1.1 {
1925 Handler* oldHandler = m_rep->handler;
|
1926 krisbash 1.3 Uint64 operationId = _NextOperationId();
1927 InstanceHandler handler(oldHandler, operationId, outParameters);
|
1928 mike 1.1 m_rep->handler = &handler;
1929 bool flag = true;
1930
1931 if (!m_rep->InvokeAsync(nameSpace, instanceName, methodName, inParameters,
|
1932 krisbash 1.3 outParameters, operationId))
|
1933 mike 1.1 {
1934 flag = false;
1935 goto done;
1936 }
1937
1938 Uint64 endTime, now;
1939
|
1940 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1941 mike 1.1 return false;
1942
1943 endTime = now + timeOutUsec;
1944
1945 for (;endTime >= now;)
1946 {
|
1947 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
1948 mike 1.1
1949 if (handler.m_state == InstanceHandler::FAILED ||
1950 handler.m_state == InstanceHandler::DONE)
1951 {
1952 break;
1953 }
1954
|
1955 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1956 mike 1.1 break;
1957 }
1958
1959 if (handler.m_state == InstanceHandler::DONE)
1960 result = handler.m_result;
1961 else
1962 flag = false;
1963
1964 done:
1965 m_rep->handler = oldHandler;
1966 return flag;
1967 }
1968
1969 bool Client::AssociatorInstances(
1970 const String& nameSpace,
1971 const DInstance& instanceName,
1972 const String& assocClass,
1973 const String& resultClass,
1974 const String& role,
1975 const String& resultRole,
1976 Uint64 timeOutUsec,
1977 mike 1.1 Array<DInstance>& instances,
1978 Result& result)
1979 {
1980 Handler* oldHandler = m_rep->handler;
|
1981 krisbash 1.3 Uint64 operationId = _NextOperationId();
1982 InstancesHandler handler(oldHandler, operationId, instances);
|
1983 mike 1.1 m_rep->handler = &handler;
1984 bool flag = true;
1985
1986 if (!m_rep->AssociatorInstancesAsync(nameSpace, instanceName, assocClass,
|
1987 krisbash 1.3 resultClass, role, resultRole, operationId))
|
1988 mike 1.1 {
1989 flag = false;
1990 goto done;
1991 }
1992
1993 Uint64 endTime, now;
1994
|
1995 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
1996 mike 1.1 return false;
1997
1998 endTime = now + timeOutUsec;
1999
2000 for (;endTime >= now;)
2001 {
|
2002 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
2003 mike 1.1
2004 if (handler.m_state == InstancesHandler::FAILED ||
2005 handler.m_state == InstancesHandler::DONE)
2006 {
2007 break;
2008 }
2009
|
2010 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
2011 mike 1.1 break;
2012 }
2013
2014 if (handler.m_state == InstancesHandler::DONE)
2015 result = handler.m_result;
2016 else
2017 flag = false;
2018
2019 done:
2020 m_rep->handler = oldHandler;
2021 return flag;
2022 }
2023
2024 bool Client::ReferenceInstances(
2025 const String& nameSpace,
2026 const DInstance& instanceName,
2027 const String& assocClass,
2028 const String& role,
2029 Uint64 timeOutUsec,
2030 Array<DInstance>& instances,
2031 Result& result)
2032 mike 1.1 {
2033 Handler* oldHandler = m_rep->handler;
|
2034 krisbash 1.3 Uint64 operationId = _NextOperationId();
2035 InstancesHandler handler(oldHandler, operationId, instances);
|
2036 mike 1.1 m_rep->handler = &handler;
2037 bool flag = true;
2038
2039 if (!m_rep->ReferenceInstancesAsync(nameSpace, instanceName, assocClass,
|
2040 krisbash 1.3 role, operationId))
|
2041 mike 1.1 {
2042 flag = false;
2043 goto done;
2044 }
2045
2046 Uint64 endTime, now;
2047
|
2048 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
2049 mike 1.1 return false;
2050
2051 endTime = now + timeOutUsec;
2052
2053 for (;endTime >= now;)
2054 {
|
2055 krisbash 1.3 Protocol_Run(&m_rep->protocol->internalProtocolBase, SELECT_BASE_TIMEOUT_MSEC * 1000);
|
2056 mike 1.1
2057 if (handler.m_state == InstancesHandler::FAILED ||
2058 handler.m_state == InstancesHandler::DONE)
2059 {
2060 break;
2061 }
2062
|
2063 krisbash 1.3 if (PAL_Time(&now) != PAL_TRUE)
|
2064 mike 1.1 break;
2065 }
2066
2067 if (handler.m_state == InstancesHandler::DONE)
2068 result = handler.m_result;
2069 else
2070 flag = false;
2071
2072 done:
2073 m_rep->handler = oldHandler;
2074 return flag;
2075 }
2076
2077 MI_END_NAMESPACE
|