00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <sigc++/sigc++.h>
00024
00025 #include <string>
00026 #include <map>
00027 #include <set>
00028
00029 #include <dbus-cxx/forward_decls.h>
00030 #include <dbus-cxx/methodbase.h>
00031 #include <dbus-cxx/dbus_signal.h>
00032
00033 #ifndef DBUSCXX_INTERFACE_H
00034 #define DBUSCXX_INTERFACE_H
00035
00036 namespace DBus {
00037
00046 class Interface
00047 {
00048 protected:
00053 Interface(const std::string& name);
00054
00055 public:
00061 typedef DBusCxxPointer<Interface> pointer;
00062
00068 typedef DBusCxxWeakPointer<Interface> weak_pointer;
00069
00079 typedef std::multimap<std::string, MethodBase::pointer> Methods;
00080
00088 typedef std::set<signal_base::pointer> Signals;
00089
00094 static pointer create( const std::string& name = std::string() );
00095
00096 virtual ~Interface();
00097
00104 Object* object() const;
00105
00107 Path path() const;
00108
00110 DBusCxxPointer<Connection> connection() const;
00111
00124 HandlerResult handle_call_message( DBusCxxPointer<Connection> connection, CallMessage::const_pointer message );
00125
00127 const std::string& name() const;
00128
00130 void set_name( const std::string& new_name );
00131
00133 const Methods& methods() const;
00134
00136 MethodBase::pointer method( const std::string& name ) const;
00137
00143 template <class T_return>
00144 DBusCxxPointer<Method<T_return> >
00145 create_method( const std::string& name );
00146
00152 template <class T_return, class T_arg1>
00153 DBusCxxPointer<Method<T_return, T_arg1> >
00154 create_method( const std::string& name );
00155
00161 template <class T_return, class T_arg1,class T_arg2>
00162 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> >
00163 create_method( const std::string& name );
00164
00170 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00171 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> >
00172 create_method( const std::string& name );
00173
00179 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00180 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00181 create_method( const std::string& name );
00182
00188 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00189 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00190 create_method( const std::string& name );
00191
00197 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00198 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00199 create_method( const std::string& name );
00200
00206 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00207 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00208 create_method( const std::string& name );
00209
00210
00211
00220 template <class T_return>
00221 DBusCxxPointer<Method<T_return> >
00222 create_method( const std::string& name, sigc::slot0<T_return> slot );
00223
00232 template <class T_return, class T_arg1>
00233 DBusCxxPointer<Method<T_return, T_arg1> >
00234 create_method( const std::string& name, sigc::slot1<T_return, T_arg1> slot );
00235
00244 template <class T_return, class T_arg1,class T_arg2>
00245 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> >
00246 create_method( const std::string& name, sigc::slot2<T_return, T_arg1,T_arg2> slot );
00247
00256 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00257 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> >
00258 create_method( const std::string& name, sigc::slot3<T_return, T_arg1,T_arg2,T_arg3> slot );
00259
00268 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00269 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00270 create_method( const std::string& name, sigc::slot4<T_return, T_arg1,T_arg2,T_arg3,T_arg4> slot );
00271
00280 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00281 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00282 create_method( const std::string& name, sigc::slot5<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> slot );
00283
00292 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00293 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00294 create_method( const std::string& name, sigc::slot6<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> slot );
00295
00304 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00305 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00306 create_method( const std::string& name, sigc::slot7<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> slot );
00307
00308
00310 bool add_method( MethodBase::pointer method );
00311
00313 void remove_method( const std::string& name );
00314
00316 bool has_method( const std::string& name ) const;
00317
00322 bool add_signal( signal_base::pointer signal );
00323
00330 bool remove_signal( signal_base::pointer signal );
00331
00335 bool remove_signal( const std::string& name );
00336
00340 bool has_signal( signal_base::pointer signal ) const;
00341
00343 bool has_signal( const std::string& name ) const;
00344
00350 template <class T_return>
00351 DBusCxxPointer<signal<T_return> >
00352 create_signal( const std::string& name );
00353
00359 template <class T_return, class T_arg1>
00360 DBusCxxPointer<signal<T_return, T_arg1> >
00361 create_signal( const std::string& name );
00362
00368 template <class T_return, class T_arg1,class T_arg2>
00369 DBusCxxPointer<signal<T_return, T_arg1,T_arg2> >
00370 create_signal( const std::string& name );
00371
00377 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00378 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3> >
00379 create_signal( const std::string& name );
00380
00386 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00387 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00388 create_signal( const std::string& name );
00389
00395 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00396 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00397 create_signal( const std::string& name );
00398
00404 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00405 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00406 create_signal( const std::string& name );
00407
00413 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00414 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00415 create_signal( const std::string& name );
00416
00417
00418
00420 const Signals& signals();
00421
00427 signal_base::pointer signal(const std::string& signal_name);
00428
00430 sigc::signal<void,const std::string&,const std::string&> signal_name_changed();
00431
00433 sigc::signal<void,MethodBase::pointer> signal_method_added();
00434
00436 sigc::signal<void,MethodBase::pointer> signal_method_removed();
00437
00439 std::string introspect(int space_depth=0) const;
00440
00441 private:
00442
00443 Object* m_object;
00444
00445 protected:
00446
00447 friend class Object;
00448
00449 void set_object( Object* object );
00450
00451 std::string m_name;
00452
00453 Methods m_methods;
00454
00455 Signals m_signals;
00456
00457 mutable pthread_rwlock_t m_methods_rwlock;
00458
00459 mutable pthread_rwlock_t m_signals_rwlock;
00460
00462 pthread_mutex_t m_name_mutex;
00463
00464 sigc::signal<void,const std::string&,const std::string&> m_signal_name_changed;
00465
00466 sigc::signal<void,MethodBase::pointer> m_signal_method_added;
00467
00468 sigc::signal<void,MethodBase::pointer> m_signal_method_removed;
00469
00470 typedef std::map<MethodBase::pointer,sigc::connection> MethodSignalNameConnections;
00471
00472 MethodSignalNameConnections m_method_signal_name_connections;
00473
00478 void on_method_name_changed(const std::string& oldname, const std::string& newname, MethodBase::pointer method);
00479
00480 void set_connection(DBusCxxPointer<Connection> conn);
00481
00482 void set_path( const std::string& new_path );
00483
00484 };
00485
00486 }
00487
00488 #include <dbus-cxx/method.h>
00489
00490 namespace DBus {
00491
00492 template <class T_return>
00493 DBusCxxPointer<Method<T_return> >
00494 Interface::create_method( const std::string& name )
00495 {
00496 DBusCxxPointer< Method<T_return> > method;
00497 method = Method<T_return>::create(name);
00498 this->add_method( method );
00499 return method;
00500 }
00501
00502 template <class T_return, class T_arg1>
00503 DBusCxxPointer<Method<T_return, T_arg1> >
00504 Interface::create_method( const std::string& name )
00505 {
00506 DBusCxxPointer< Method<T_return, T_arg1> > method;
00507 method = Method<T_return, T_arg1>::create(name);
00508 this->add_method( method );
00509 return method;
00510 }
00511
00512 template <class T_return, class T_arg1,class T_arg2>
00513 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> >
00514 Interface::create_method( const std::string& name )
00515 {
00516 DBusCxxPointer< Method<T_return, T_arg1,T_arg2> > method;
00517 method = Method<T_return, T_arg1,T_arg2>::create(name);
00518 this->add_method( method );
00519 return method;
00520 }
00521
00522 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00523 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> >
00524 Interface::create_method( const std::string& name )
00525 {
00526 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3> > method;
00527 method = Method<T_return, T_arg1,T_arg2,T_arg3>::create(name);
00528 this->add_method( method );
00529 return method;
00530 }
00531
00532 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00533 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00534 Interface::create_method( const std::string& name )
00535 {
00536 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00537 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(name);
00538 this->add_method( method );
00539 return method;
00540 }
00541
00542 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00543 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00544 Interface::create_method( const std::string& name )
00545 {
00546 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00547 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(name);
00548 this->add_method( method );
00549 return method;
00550 }
00551
00552 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00553 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00554 Interface::create_method( const std::string& name )
00555 {
00556 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00557 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(name);
00558 this->add_method( method );
00559 return method;
00560 }
00561
00562 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00563 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00564 Interface::create_method( const std::string& name )
00565 {
00566 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00567 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(name);
00568 this->add_method( method );
00569 return method;
00570 }
00571
00572
00573
00574 template <class T_return>
00575 DBusCxxPointer<Method<T_return> >
00576 Interface::create_method( const std::string& name, sigc::slot0<T_return> slot )
00577 {
00578 DBusCxxPointer< Method<T_return> > method;
00579 method = Method<T_return>::create(name);
00580 method->set_method( slot );
00581 this->add_method( method );
00582 return method;
00583 }
00584
00585 template <class T_return, class T_arg1>
00586 DBusCxxPointer<Method<T_return, T_arg1> >
00587 Interface::create_method( const std::string& name, sigc::slot1<T_return, T_arg1> slot )
00588 {
00589 DBusCxxPointer< Method<T_return, T_arg1> > method;
00590 method = Method<T_return, T_arg1>::create(name);
00591 method->set_method( slot );
00592 this->add_method( method );
00593 return method;
00594 }
00595
00596 template <class T_return, class T_arg1,class T_arg2>
00597 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> >
00598 Interface::create_method( const std::string& name, sigc::slot2<T_return, T_arg1,T_arg2> slot )
00599 {
00600 DBusCxxPointer< Method<T_return, T_arg1,T_arg2> > method;
00601 method = Method<T_return, T_arg1,T_arg2>::create(name);
00602 method->set_method( slot );
00603 this->add_method( method );
00604 return method;
00605 }
00606
00607 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00608 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> >
00609 Interface::create_method( const std::string& name, sigc::slot3<T_return, T_arg1,T_arg2,T_arg3> slot )
00610 {
00611 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3> > method;
00612 method = Method<T_return, T_arg1,T_arg2,T_arg3>::create(name);
00613 method->set_method( slot );
00614 this->add_method( method );
00615 return method;
00616 }
00617
00618 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00619 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00620 Interface::create_method( const std::string& name, sigc::slot4<T_return, T_arg1,T_arg2,T_arg3,T_arg4> slot )
00621 {
00622 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00623 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(name);
00624 method->set_method( slot );
00625 this->add_method( method );
00626 return method;
00627 }
00628
00629 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00630 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00631 Interface::create_method( const std::string& name, sigc::slot5<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> slot )
00632 {
00633 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00634 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(name);
00635 method->set_method( slot );
00636 this->add_method( method );
00637 return method;
00638 }
00639
00640 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00641 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00642 Interface::create_method( const std::string& name, sigc::slot6<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> slot )
00643 {
00644 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00645 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(name);
00646 method->set_method( slot );
00647 this->add_method( method );
00648 return method;
00649 }
00650
00651 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00652 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00653 Interface::create_method( const std::string& name, sigc::slot7<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> slot )
00654 {
00655 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00656 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(name);
00657 method->set_method( slot );
00658 this->add_method( method );
00659 return method;
00660 }
00661
00662
00663
00664 template <class T_return>
00665 DBusCxxPointer<signal<T_return> >
00666 Interface::create_signal( const std::string& name )
00667 {
00668 DBusCxxPointer<DBus::signal<T_return> > sig;
00669 sig = DBus::signal<T_return>::create(m_name, name);
00670 if ( this->add_signal(sig) ) return sig;
00671 return DBusCxxPointer<DBus::signal<T_return> >();
00672 }
00673
00674 template <class T_return, class T_arg1>
00675 DBusCxxPointer<signal<T_return, T_arg1> >
00676 Interface::create_signal( const std::string& name )
00677 {
00678 DBusCxxPointer<DBus::signal<T_return, T_arg1> > sig;
00679 sig = DBus::signal<T_return, T_arg1>::create(m_name, name);
00680 if ( this->add_signal(sig) ) return sig;
00681 return DBusCxxPointer<DBus::signal<T_return, T_arg1> >();
00682 }
00683
00684 template <class T_return, class T_arg1,class T_arg2>
00685 DBusCxxPointer<signal<T_return, T_arg1,T_arg2> >
00686 Interface::create_signal( const std::string& name )
00687 {
00688 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2> > sig;
00689 sig = DBus::signal<T_return, T_arg1,T_arg2>::create(m_name, name);
00690 if ( this->add_signal(sig) ) return sig;
00691 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2> >();
00692 }
00693
00694 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00695 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3> >
00696 Interface::create_signal( const std::string& name )
00697 {
00698 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3> > sig;
00699 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3>::create(m_name, name);
00700 if ( this->add_signal(sig) ) return sig;
00701 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3> >();
00702 }
00703
00704 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00705 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00706 Interface::create_signal( const std::string& name )
00707 {
00708 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > sig;
00709 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(m_name, name);
00710 if ( this->add_signal(sig) ) return sig;
00711 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >();
00712 }
00713
00714 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00715 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00716 Interface::create_signal( const std::string& name )
00717 {
00718 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > sig;
00719 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(m_name, name);
00720 if ( this->add_signal(sig) ) return sig;
00721 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >();
00722 }
00723
00724 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00725 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00726 Interface::create_signal( const std::string& name )
00727 {
00728 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > sig;
00729 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(m_name, name);
00730 if ( this->add_signal(sig) ) return sig;
00731 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >();
00732 }
00733
00734 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00735 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00736 Interface::create_signal( const std::string& name )
00737 {
00738 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00739 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(m_name, name);
00740 if ( this->add_signal(sig) ) return sig;
00741 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >();
00742 }
00743
00744
00745
00746 }
00747
00748 #endif
00749