logo
Литература_1 / photon_old

Соглашения по именам

Вы можете определить уникальные имена для Ваших коннекторов, следуя таким соглашением по именованию:

      1. Пример

Это приложение использует коннектор для определения того, запущен ли уже другой экземпляр приложения. Программа принимает две опции командной строки:

-e Если другой экземпляр приложения уже выполняется, приказать ему закрыться

-f file Если другой экземпляр приложения уже выполняется, приказать ему открыть заданный файл, в противном случае просто открыть файл.

Вот код:

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "abimport.h"

#include "proto.h"

enum MyMsgType {

MY_MSGTYPE_EXIT, MY_MSGTYPE_OPEN_DOC, MY_MSGTYPE_TOFRONT

};

enum MyReplyType {

MY_REPTYPE_SUCCESS, MY_REPTYPE_BADMSG

};

struct MyMsg {

char docname[ PATH_MAX ];

};

struct MyReply {

enum MyReplyType status;

};

/* Обработка сообщений клиента: */

static PtConnectionMsgFunc_t msghandler;

static void const *msghandler(

PtConnectionServer_t *connection, void *data,

unsigned long type, void const *msgptr,

unsigned msglen, unsigned *reply_len

) {

struct MyMsg const *msg = (struct MyMsg const*) msgptr;

struct MyReply reply;

reply.status = MY_REPTYPE_SUCCESS;

switch ( type ) {

case MY_MSGTYPE_EXIT :

PtConnectionReply( connection, sizeof(reply), &reply );

PtExit( EXIT_SUCCESS );

break;

case MY_MSGTYPE_OPEN_DOC :

reply.status = OpenNewDocument( msg->docname );

break;

case MY_MSGTYPE_TOFRONT : break;

default : reply.status = MY_REPTYPE_BADMSG;

} // switch(type)

PtWindowToFront( ABW_base );

*reply_len = sizeof(reply);

return &reply;

} // Функции msghandler()

/* Установка нового коннектора: */

static PtConnectorCallbackFunc_t connector_callback;

static void connector_callback(

PtConnector_t *connector,

PtConnectionServer_t *connection,

void *data ) {

static const PtConnectionMsgHandler_t

handlers = { 0, msghandler };

if ( PtConnectionAddMsgHandlers( connection, &handlers, 1 ) != 0 ) {

fputs( "Unable to set up connection handler\n", stderr );

PtConnectionServerDestroy( connection );

} } // Функции connector_callback()

/* Строка Опций приложения */

const char ApOptions[] = AB_OPTIONS "ef:"; /* Добавление Ваших опций в "" */

/* Функция инициализации приложения */

int init( int argc, char *argv[] ) {

struct MyMsg msg;

int opt;

long msgtype = MY_MSGTYPE_TOFRONT;

const char *document = NULL;

static const char name[] = "me@myself.com/ConnectionExample";

while ( ( opt = getopt( argc, argv, ApOptions ) ) != -1 )

switch ( opt ) {

case '?' : PtExit( EXIT_FAILURE );

case 'e' : msgtype = MY_MSGTYPE_EXIT; break;

case 'f' : document = optarg;

}

if ( document )

if ( msgtype == MY_MSGTYPE_EXIT ) {

fputs("Вы не можете задать одновременно опции -e и -f\n", stderr );

PtExit( EXIT_FAILURE );

}

else {

msgtype = MY_MSGTYPE_OPEN_DOC;

strncpy( msg.docname, document, sizeof(msg.docname)-1 );

}

while ( PtConnectorCreate( name, connector_callback, 0 ) = = NULL ) {

/* Если это вернуло неудачу, должно быть другой экземпляр приложения уже запущен */

PtConnectionClient_t *clnt;

if ( ( clnt = PtConnectionFindName( name, 0, 0 ) ) != 0 ) {

struct MyReply reply;

int result = PtConnectionSend( clnt, msgtype, &msg, &reply, sizeof(msg), sizeof(reply) );

PtConnectionClientDestroy( clnt );

if (result = = 0) PtExit( reply.status );

}}

/* Поскольку PtConnectorCreate() выполнен успешно,

выполняется только один экземпляр приложения */

if ( msgtype == MY_MSGTYPE_EXIT ) {

fputs( "Не могу приказать ему завершиться; он и так не выполняется\n", stderr );

PtExit( EXIT_FAILURE );

}

if ( document ) OpenNewDocument( document );

return Pt_CONTINUE;

}

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4