summaryrefslogtreecommitdiff
path: root/misc/freeswitch/scripts/dialplan/fax.lua
diff options
context:
space:
mode:
Diffstat (limited to 'misc/freeswitch/scripts/dialplan/fax.lua')
-rw-r--r--misc/freeswitch/scripts/dialplan/fax.lua232
1 files changed, 232 insertions, 0 deletions
diff --git a/misc/freeswitch/scripts/dialplan/fax.lua b/misc/freeswitch/scripts/dialplan/fax.lua
new file mode 100644
index 0000000..2a40620
--- /dev/null
+++ b/misc/freeswitch/scripts/dialplan/fax.lua
@@ -0,0 +1,232 @@
+-- Gemeinschaft 5 module: fax class
+-- (c) AMOOMA GmbH 2012
+--
+
+module(...,package.seeall)
+
+FAX_DOCUMENTS_DIRECTORY = '/tmp/'
+FAX_PARALLEL_MAX = 8;
+Fax = {}
+
+-- Create Fax object
+function Fax.new(self, arg)
+ arg = arg or {}
+ object = arg.object or {}
+ setmetatable(object, self)
+ self.__index = self
+ self.class = 'faxaccount';
+ self.log = arg.log;
+ self.database = arg.database;
+ self.record = arg.record;
+ self.fax_directory = arg.fax_directory or FAX_DOCUMENTS_DIRECTORY;
+ return object;
+end
+
+-- find fax account by id
+function Fax.find_by_id(self, id)
+ local sql_query = 'SELECT * FROM `fax_accounts` WHERE `id` = ' .. tonumber(id) .. ' LIMIT 1';
+ local fax_account = nil;
+
+ self.database:query(sql_query, function(fax_entry)
+ fax_account = Fax:new(self);
+ fax_account.record = fax_entry;
+ fax_account.id = tonumber(fax_entry.id);
+ fax_account.uuid = fax_entry.uuid;
+ end)
+
+ return fax_account;
+end
+
+
+-- find fax account by uuid
+function Fax.find_by_uuid(self, uuid)
+ local sql_query = 'SELECT * FROM `fax_accounts` WHERE `uuid` = "' .. uuid .. '" LIMIT 1';
+ local fax_account = nil;
+
+ self.database:query(sql_query, function(fax_entry)
+ fax_account = Fax:new(self);
+ fax_account.record = fax_entry;
+ fax_account.id = tonumber(fax_entry.id);
+ fax_account.uuid = fax_entry.uuid;
+ end)
+
+ return fax_account;
+end
+
+
+function Fax.destination_numbers(self, id)
+ local sql_query = 'SELECT `number` FROM `phone_numbers` WHERE `phone_numberable_type` = "FaxDocument" AND `phone_numberable_id` = ' .. tonumber(id);
+ local destination_numbers = {}
+
+ self.database:query(sql_query, function(fax_entry)
+ table.insert(destination_numbers, fax_entry.number);
+ end)
+
+ return destination_numbers;
+end
+
+function Fax.destination_number(self, id)
+ local sql_query = 'SELECT `number` FROM `phone_numbers` WHERE `phone_numberable_type` = "FaxDocument" AND `phone_numberable_id`= ' .. tonumber(id) .. ' LIMIT 1';
+ local destination_number = nil;
+
+ self.database:query(sql_query, function(fax_entry)
+ destination_number = fax_entry.number;
+ end)
+
+ return destination_number;
+end
+
+-- List waiting fax documents
+function Fax.queued_for_sending(self, limit)
+ limit = limit or FAX_PARALLEL_MAX;
+ local sql_query = 'SELECT * FROM `fax_documents` WHERE `state` IN ("queued_for_sending","unsuccessful") AND `retry_counter` > 0 ORDER BY `sent_at` ASC LIMIT ' .. limit;
+ local fax_documents = {}
+ self.database:query(sql_query, function(fax_entry)
+ fax_entry['destination_numbers'] = Fax:destination_numbers(fax_entry.id)
+ table.insert(fax_documents, fax_entry);
+ end)
+
+ return fax_documents;
+end
+
+-- Update fax document sending status
+function Fax.document_update(self, id, params)
+ require 'common.str'
+ local params_sql = {}
+
+ for name, value in pairs(params) do
+ table.insert(params_sql, '`' .. name .. '`=' .. common.str.to_sql(value));
+ end
+
+ if not params['sent_at'] then
+ table.insert(params_sql, '`sent_at`=NOW()');
+ end
+
+ if not params['updated_at'] then
+ table.insert(params_sql, '`updated_at`=NOW()');
+ end
+
+ local sql_query = 'UPDATE `fax_documents` SET ' .. table.concat(params_sql, ',') .. ' WHERE `id` = ' .. tonumber(id);
+
+ return self.database:query(sql_query);
+end
+
+
+function Fax.get_parameters(self, caller)
+ local fax_parameters = {
+ bad_rows = caller:to_i('fax_bad_rows'),
+ total_pages = caller:to_i('fax_document_total_pages'),
+ transferred_pages = caller:to_i('fax_document_transferred_pages'),
+ ecm_requested = caller:to_b('fax_ecm_requested'),
+ ecm_used = caller:to_b('fax_ecm_used'),
+ filename = caller:to_s('fax_filename'),
+ image_resolution = caller:to_s('fax_image_resolution'),
+ image_size = caller:to_i('fax_image_size'),
+ local_station_id = caller:to_s('fax_local_station_id'),
+ result_code = caller:to_i('fax_result_code'),
+ result_text = caller:to_s('fax_result_text'),
+ remote_station_id = caller:to_s('fax_remote_station_id'),
+ success = caller:to_b('fax_success'),
+ transfer_rate = caller:to_i('fax_transfer_rate'),
+ v17_disabled = caller:to_b('fax_v17_disabled'),
+ }
+
+ return fax_parameters;
+end
+
+-- Receive Fax
+function Fax.receive(self, caller, file_name)
+ file_name = file_name or self.fax_directory .. 'fax_in_' .. caller.uuid .. '.tiff';
+
+ caller:set_variable('fax_ident', self.record.station_id)
+ caller:set_variable('fax_verbose', 'false')
+
+ caller:answer();
+ local start_time = os.time();
+ caller:execute('rxfax', file_name);
+ local record = self:get_parameters(caller);
+ record.transmission_time = os.time() - start_time;
+ return record;
+end
+
+-- Send Fax
+function Fax.send(self, caller, file_name)
+ caller:set_variable('fax_ident', self.record.station_id)
+ caller:set_variable('fax_header', self.record.name)
+ caller:set_variable('fax_verbose', 'false')
+ local start_time = os.time();
+ caller:execute('txfax', file_name);
+ local record = self:get_parameters(caller);
+ record.transmission_time = os.time() - start_time;
+ return record;
+end
+
+-- find fax document by id
+function Fax.find_document_by_id(self, id)
+ local sql_query = 'SELECT * FROM `fax_documents` WHERE `id` = ' .. tonumber(id) .. ' LIMIT 1'
+ local record = nil
+
+ self.database:query(sql_query, function(fax_entry)
+ record = fax_entry;
+ end);
+
+ return record;
+end
+
+-- save fax document to database
+function Fax.insert_document(self, record)
+ require 'common.str'
+ local sql_query = 'INSERT INTO `fax_documents` ( \
+ inbound, \
+ retry_counter, \
+ fax_resolution_id, \
+ state, \
+ transmission_time, \
+ sent_at, \
+ document_total_pages, \
+ document_transferred_pages, \
+ ecm_requested, \
+ ecm_used, \
+ image_resolution, \
+ image_size, \
+ local_station_id, \
+ result_code, \
+ remote_station_id, \
+ success, \
+ transfer_rate, \
+ created_at, \
+ updated_at, \
+ fax_account_id, \
+ caller_id_number, \
+ caller_id_name, \
+ tiff, \
+ uuid \
+ ) VALUES ( \
+ true, \
+ 0, \
+ 1, \
+ "received", \
+ ' .. common.str.to_sql(record.transmission_time) .. ', \
+ NOW(), \
+ ' .. common.str.to_sql(record.total_pages) .. ', \
+ ' .. common.str.to_sql(record.transferred_pages) .. ', \
+ ' .. common.str.to_sql(record.ecm_requested) .. ', \
+ ' .. common.str.to_sql(record.ecm_used) .. ', \
+ ' .. common.str.to_sql(record.image_resolution) .. ', \
+ ' .. common.str.to_sql(record.image_size) .. ', \
+ ' .. common.str.to_sql(record.local_station_id) .. ', \
+ ' .. common.str.to_sql(record.result_code) .. ', \
+ ' .. common.str.to_sql(record.remote_station_id) .. ', \
+ ' .. common.str.to_sql(record.success) .. ', \
+ ' .. common.str.to_sql(record.transfer_rate) .. ', \
+ NOW(), \
+ NOW(), \
+ ' .. common.str.to_sql(self.id) .. ', \
+ ' .. common.str.to_sql(record.caller_id_number) .. ', \
+ ' .. common.str.to_sql(record.caller_id_name) .. ', \
+ ' .. common.str.to_sql(record.filename) .. ', \
+ ' .. common.str.to_sql(record.uuid) .. ' \
+ )';
+
+ return self.database:query(sql_query);
+end