Beispiel #1
0
void Thread :: ShutdownInternalThread(bool waitForThread)
{
   if (IsInternalThreadRunning())
   {
      (void) SendMessageToInternalThread(MessageRef());  // a NULL message ref tells him to quit
      if (waitForThread) WaitForInternalThreadToExit();
   }
}
MessageRef SLIPFramedDataMessageIOGateway :: PopNextOutgoingMessage()
{
   MessageRef msg = RawDataMessageIOGateway::PopNextOutgoingMessage();
   if (msg() == NULL) return MessageRef();

   MessageRef slipMsg = GetLightweightCopyOfMessageFromPool(*msg());
   if (slipMsg() == NULL) return MessageRef();

   (void) slipMsg()->RemoveName(PR_NAME_DATA_CHUNKS);  // make sure we don't modify the field object in (msg)

   // slipMsg will be like (msg), except that we've slip-encoded each data item
   const uint8 * buf;
   uint32 numBytes;
   for (int32 i=0; msg()->FindData(PR_NAME_DATA_CHUNKS, B_ANY_TYPE, i, (const void **) &buf, &numBytes) == B_NO_ERROR; i++)
   {
      ByteBufferRef slipData = SLIPEncodeBytes(buf, numBytes);
      if ((slipData()==NULL)||(slipMsg()->AddFlat(PR_NAME_DATA_CHUNKS, slipData) != B_NO_ERROR)) return MessageRef();
   }

   return slipMsg;
}
Beispiel #3
0
	virtual MessageRef recv(int32_t timeout) {
		reading = true;
		int64_t end = Util::currentTimeMillis() + timeout;
		while(messages.empty()) {
			if(timeout == -1) {
				group->update(-1);
			} else {
				int64_t now = Util::currentTimeMillis();
				int64_t left = end - now;
				if(left < 1) {
					reading = false;
					return MessageRef();
				}
				group->update((int32_t) left);
			}
		}
		MessageRef ret(messages.front());
		messages.pop_front();
		reading = false;
		return ret;
	}
MessageRef ReadZipFile(DataIO & readFrom, bool loadData)
{
   TCHECKPOINT;

   static const int NAME_BUF_LEN = 8*1024;  // names longer than 8KB are ridiculous anyway!
   char * nameBuf = newnothrow_array(char, NAME_BUF_LEN);
   if (nameBuf)
   {
      MessageRef ret = GetMessageFromPool();
      if (ret())
      {
         zlib_filefunc_def zdefs = {
            fopen_dataio_func,
            fread_dataio_func,
            fwrite_dataio_func,
            ftell_dataio_func,
            fseek_dataio_func,
            fclose_dataio_func,
            ferror_dataio_func,
            &readFrom
         };
         zipFile zf = unzOpen2(NULL, &zdefs);
         if (zf != NULL)
         {
            if (ReadZipFileAux(zf, *ret(), nameBuf, NAME_BUF_LEN, loadData) != B_NO_ERROR) ret.Reset();
            unzClose(zf);
         }
         else ret.Reset();  // failure!
      }
      delete [] nameBuf;
      return ret;
   }
   else WARN_OUT_OF_MEMORY;

   return MessageRef();
}
Beispiel #5
0
void MailMessenger::authConnected(WP::err error)
{
    if (error == WP::kContactNeeded) {
        startContactRequest();
        return;
    } else if (error != WP::kOk) {
        emit jobDone(error);
        return;
    }

    MessageChannelRef targetMessageChannel = MessageChannelRef();
    if (message->getChannel().staticCast<MessageChannel>()->isNewLocale()) {
        targetMessageChannel = MessageChannelRef(
            new MessageChannel(message->getChannel().staticCast<MessageChannel>(), targetContact,
                                              targetContact->getKeys()->getMainKeyId()));
    }

    QByteArray data;
    ProtocolOutStream outStream(&data);
    IqOutStanza *iqStanza = new IqOutStanza(kSet);
    outStream.pushStanza(iqStanza);

    Contact *myself = userIdentity->getMyself();
    OutStanza *messageStanza =  new OutStanza("put_message");
    messageStanza->addAttribute("server_user", targetUser);
    messageStanza->addAttribute("channel", message->getChannel()->getUid());
    outStream.pushChildStanza(messageStanza);

    QString signatureKeyId = myself->getKeys()->getMainKeyId();

    // write new channel
    if (targetMessageChannel != NULL) {
        error = XMLSecureParcel::write(&outStream, myself, signatureKeyId,
                                       targetMessageChannel.data(), "channel");
        if (error != WP::kOk) {
            emit jobDone(error);
            return;
        }
    }

    // write new channel info
    MessageChannelInfoRef info = message->getChannelInfo();
    if (info->isNewLocale()) {
        error = XMLSecureParcel::write(&outStream, myself, signatureKeyId, info.data(),
                                       "channel_info");
        if (error != WP::kOk) {
            emit jobDone(error);
            return;
        }
    }

    // write message
    error = XMLSecureParcel::write(&outStream, myself, signatureKeyId, message.data(), "message");
    if (error != WP::kOk) {
        emit jobDone(error);
        return;
    }

    outStream.flush();

    message = MessageRef();

    serverReply = remoteConnection->send(data);
    connect(serverReply, SIGNAL(finished(WP::err)), this, SLOT(handleReply(WP::err)));
}