كيف يمكنني إنشاء د-خدمة الحافلات بشكل حيوي يخلق كائنات متعددة?

StackOverflow https://stackoverflow.com/questions/667760

  •  21-08-2019
  •  | 
  •  

سؤال

أنا جديد D-Bus (و الثعبان, مزدوجة!) وأنا في محاولة لمعرفة أفضل طريقة لفعل شيء التي تم مناقشتها في البرنامج التعليمي.

ومع ذلك ، فإن تطبيق محرر النص يمكن بسهولة خاصة متعددة حافلة أسماء (على سبيل المثال ، org.كدي.KWrite في بالإضافة إلى عامة TextEditor) ، كائنات متعددة (ربما /org/kde/الوثائق/4352 حيث عدد التغييرات وفقا الوثيقة) و كل كائن يمكن أن تنفيذ واجهات متعددة ، مثل org.freedesktop.Dbus تثبيت.Introspectable, org.freedesktop.BasicTextField, org.كدي.RichTextDocument.

على سبيل المثال ، يقول أريد إنشاء التفاف حول flickrapi هذه الخدمة يمكن أن يعرض حفنة من فليكر API طرق (ويقول ، urls_lookupGroup()).هذا هو بسيط نسبيا إذا كنت تريد أن نفترض أن الخدمة سوف تكون دائما تحديد نفس مفتاح API و أن مصادقة المعلومات سوف تكون هي نفسها بالنسبة للجميع استخدام هذه الخدمة.

خاصة في الحالة الأخيرة, أنا حقا لا أستطيع أن نفترض سوف يكون هذا صحيحا.

استنادا إلى الوثائق المذكورة أعلاه ، أنا أعتقد يجب أن يكون هناك شيء من هذا القبيل:

# Get the connection proxy object.
flickrConnectionService = bus.get_object("com.example.FlickrService",
                                         "/Connection")

# Ask the connection object to connect, the return value would be
# maybe something like "/connection/5512" ...
flickrObjectPath = flickrConnectionService.connect("MY_APP_API_KEY",
                                                   "MY_APP_API_SECRET",
                                                   flickrUsername)

# Get the service proxy object.
flickrService = bus.get_object("com.example.FlickrService",
                               flickrObjectPath);

# As the flickr service object to get group information.
groupInfo = flickrService.getFlickrGroupInfo('s3a-belltown')

لذا أسئلتي:

1) هل هكذا يجب أن يكون التعامل معها ؟

2) إذا كان الأمر كذلك ، كيف سيكون خدمة معرفة عندما يكون العميل القيام به ؟ هل هناك طريقة للكشف عن إذا كان العميل الحالي قد كسر اتصال بحيث يمكن خدمة تنظيف لها إنشاؤه بشكل حيوي الكائنات ؟ أيضا كيف يمكنني إنشاء كائنات فردية في المقام الأول ؟

3) إذا لم تكن هذه هي الكيفية التي ينبغي أن يتم التعامل معها ، ما هي بعض الاقتراحات الأخرى من أجل تحقيق شيء مماثل ؟

لقد قرأت من خلال عدد من D-Bus الدروس ومختلف الوثائق عن أقرب جئت إلى رؤية ما أبحث عنه هو ما اقتبسته أعلاه.ومع ذلك ، فإن أيا من الأمثلة أنظر إلى القيام به في الواقع أي شيء من هذا القبيل لذلك أنا غير متأكد من كيفية المضي قدما.

هل كانت مفيدة؟

المحلول

1) في الغالب نعم, وأود أن تغير شيء واحد فقط في ربط الطريقة كما شرحت في 2).

2) D-Bus اتصالات ليست ثابتة ، كل شيء يتم مع طلب/الاستجابة رسائل لا علاقة الدولة يتم تخزين ما لم يتم تطبيق هذا في الثالث الكائنات كما تفعل مع flickerObject.D-bus الكائنات في بايثون الارتباطات معظمهم من وكلاء مجردة الكائنات البعيدة كما لو كنت "متصل" لهم ، ولكن ما يفعله هو حقا لبناء الرسائل استنادا إلى المعلومات التي تعطيها إلى D-Bus إنشاء مثيل الكائن (كائن المسار واجهة وهكذا).وبالتالي فإن الخدمة لا يمكن أن تعرف عند العميل ويتم ذلك إذا كان العميل لا تعلن ذلك مع أخرى واضحة.

التعامل مع غير متوقعة العميل الانتهاء يمكنك إنشاء D-Bus الكائن في العميل إرسال الكائن مسار الخدمة عند الاتصال ، connect طريقة لقبول أيضا ObjectPath معلمة.الخدمة يمكن الاستماع إلى NameOwnerChanged إشارة إلى معرفة ما إذا كان العميل قد مات.

لإنشاء كائن الفردية لديك فقط إلى مثيل كائن في نفس الخدمة كما تفعل مع الخاص بك "/اتصال" ، ولكن عليك أن تكون على يقين من أن كنت تستخدم unexisting اسم.يمكن أن يكون لديك "/اتصال/مدير" مختلف "/اتصال/1", "/اتصال/2"...

3) إذا كنت بحاجة إلى تخزين اتصال الدولة ، عليك أن تفعل شيئا من هذا القبيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top